2025年json库——jsoncpp

json库——jsoncpp一 jsoncpp 简介 JsonCpp 是一个开源的 C 库 用于解析和生成 JSON JavaScript Object Notation 数据格式 JSON 是一种轻量级的数据交换格式 广泛用于各种应用程序和网络服务中 JsonCpp 提供了简单和易用的 API

大家好,我是讯享网,很高兴认识大家。

一、jsoncpp简介

JsonCpp提供了简单和易用的API,可以方便地解析JSON字符串并将其转换为C++对象,同时也可以将C++对象序列化为JSON字符串。它支持标准的JSON语法,并提供了许多功能,如访问和修改JSON对象的属性、数组操作、遍历等。

JsonCpp库的主要特点包括:

轻量级:JsonCpp具有很小的代码体积和低的内存占用,因此非常适合嵌入式系统或资源受限的环境。

跨平台:JsonCpp可以在多种操作系统上运行,包括Windows、Linux、Mac等。

简单易用:JsonCpp提供了简洁的API,使得解析和生成JSON数据变得非常容易。开发人员可以通过简单的函数调用来实现JSON数据的读取、修改和生成。

高性能:JsonCpp采用了高效的算法和数据结构,提供了快速的JSON解析和生成功能。

可靠稳定:JsonCpp经过广泛的测试和使用,已经成为一个成熟的库。它具有良好的稳定性和可靠性,可以处理各种复杂的JSON数据结构

二、下载源码

https://github.com/open-source-parsers/jsoncpp
首先阅读下面的README.md,主要看这句、合并源,我们可以点击这个链接进去
https://github.com/open-source-parsers/jsoncpp/wiki/Amalgamated- (Possibly-outdated)

阅读一下这段话,也可以翻译一下
在这里插入图片描述
讯享网

将JsonCpp集成到您的项目中的一种方法是将汇总的源代码(一个.cpp文件和两个.h文件)包含在您的项目中,并像编译和构建其他源文件一样进行编译和构建。这样可以确保编译标志的一致性和ABI兼容性,这些问题在构建共享库或静态库时会出现。下面的部分提供了详细的说明。

将include/目录添加到您的编译器包含路径中。您可以按照以下方式包含JsonCpp头文件:

#include <json/json.h> 

讯享网

如果在Windows上将JsonCpp构建为动态库,则项目需要定义宏JSON_DLL。

生成汇总的源代码和头文件JsonCpp提供了一个脚本用于生成单个头文件和单个源文件,以便于包含到现有项目中。可以通过从顶层目录运行以下命令随时生成汇总的源代码(需要Python3.4+):

讯享网 python amalgamate.py 

您可以指定头文件名。有关详细信息,请参阅-h选项。

默认情况下,将生成以下文件:

dist/jsoncpp.cpp:需要添加到您的项目中的源文件。
dist/json/json.h:用于在项目中使用的相应头文件。与在非汇总源代码中包含json/json.h相当。此头文件仅依赖于标准头文件。
dist/json/json-forwards.h:提供所有JsonCpp类型的前向声明的头文件。汇总的源代码是通过按正确的顺序连接JsonCpp源代码并定义宏JSON_IS_AMALGAMATION来生成的,以防止包含其他头文件。

在这里插入图片描述

下载后找到下面文件
在这里插入图片描述
在当前目录下打开终端,执行下面的命令

python amalgamate.py 

在这里插入图片描述
你就可以在当前目录下找到dist目录,里面就有我们需要的三个文件
在这里插入图片描述
我们终于可以使用它了

三、具体应用

Json格式简介

可读性:JSON使用文本格式表示数据,易于阅读和理解。它采用了类似于JavaScript对象的键值对的形式来组织数据。

简洁性:JSON的语法非常简洁,相比于其他数据格式(如XML),它的数据表示更为紧凑,节省了传输和存储空间。

支持多种数据类型:JSON支持多种基本数据类型,包括字符串、数字、布尔值、数组、对象和null。这使得JSON非常灵活,可以表示各种类型的数据结构。

易于解析和生成:JSON数据可以轻松地由各种编程语言解析和生成。许多编程语言都提供了内置的JSON解析器和生成器,使得处理JSON数据变得简单和方便。

跨平台和语言无关:由于JSON是一种通用的数据格式,它不依赖于任何特定的平台或编程语言。这意味着JSON可以在不同的系统和不同的编程语言之间进行数据交换和共享。

可扩展性:JSON支持嵌套结构,允许在对象中嵌套其他对象或数组,从而实现复杂的数据结构。这种嵌套结构可以实现数据的层级关系和组织。

平台无关的数据交换格式:由于JSON的广泛支持和普及性,它已成为一种通用的数据交换格式。许多Web服务和API都使用JSON作为数据交换的标准格式。

基本示例

讯享网{ 
    "name": "John", "age": 18, "isStudent": true, "hobbies": ["runing", "traveling"], "address": { 
    "street": "999 Main St", "city": "hangzhou" } } 

上述示例表示一个包含个人信息的JSON对象。它包括名称、年龄、是否是学生、兴趣爱好和地址等属性。注意JSON中使用双引号表示键和字符串值,使用逗号分隔不同的键值对,使用方括号表示数组,使用花括号表示对象

基本语法:

①.Json 键值对:键值对是 Json 的基本构成。其中,名称即对象的属性名称,必须包含在双引号( " " )中;值即对象对应的属性值;名称和值之间用冒号( : )隔开。
②.Json 值:Json 的值可以是以下几种:字符串、数字( 整型、浮点型 )、布尔值( ture、false )、空值( null )、数组、对象。
③.Json 对象:Json 对象是用大括号( {、} )括起来的一系列 Json 键值对的集合,键值对之间用逗号( , )隔开。
④.Json 数组:Json 数组是用中括号( [、] )括起来的一系列 Json 值的集合,值之间用逗号( , )隔开。

json2str

std::string json2str(const Json::Value &v, bool needFormat) { 
    if (needFormat) { 
    Json::StreamWriterBuilder writer; std::string jsonString = Json::writeString(writer, v); return jsonString; } else { 
    Json::FastWriter fastWriter; return fastWriter.write(v); } } 

str2json

讯享网bool str2json(const std::string &str, Json::Value &v) { 
    Json::CharReaderBuilder readerBuilder; std::istringstream iss(str); std::string errs; bool parsingSuccessful = Json::parseFromStream(readerBuilder, iss, &v, &errs); if (!parsingSuccessful) { 
    std::cout << "Failed to parse JSON: " << errs << std::endl; return false; } return true; } 

str2file

bool str2file(const std::string &path, const std::string &data) { 
    std::ofstream file(path); if (!file.is_open()) { 
    return false; } file << data; file.close(); return true; } 

file2json

讯享网bool file2json(const std::string &file, Json::Value &v) { 
    std::ifstream inputFile(file); if (!inputFile.is_open()) { 
    std::cout << "Failed to open file: " << file << std::endl; return false; } Json::CharReaderBuilder readerBuilder; std::string errs; bool parsingSuccessful = Json::parseFromStream(readerBuilder, inputFile, &v, &errs); inputFile.close(); if (!parsingSuccessful) { 
    std::cout << "Failed to parse JSON: " << errs << std::endl; return false; } return true; } 

main

int main() { 
    // 创建一个Json::Value对象 Json::Value root; Json::Value rootaddress; // 添加数据到Json对象 root["name"] = "xiaolan"; // 字符串 root["age"] = 18; // 数字 root["isStudent"] = true; // bool类型 Json::Value hobbies(Json::arrayValue); // 创建包含兴趣爱好的 JSON 数组 hobbies.append("running"); hobbies.append("traveling"); root["hobbies"] = hobbies; Json::Value address; // 创建嵌套的 JSON 对象 address["street"] = "321 Main St"; address["city"] = "hangzhou"; root["address"] = address; std::cout << "root: " << root << std::endl; // 生成 JSON 字符串 std::string jsonString = json2str(root, true); // 转换为带格式的 JSON 字符串 std::cout << "带格式jsonString: " << jsonString << std::endl; jsonString = json2str(root, false); // 转换为紧凑的 JSON 字符串 std::cout << "紧凑jsonString: " << jsonString << std::endl; // 字符串变为json std::string jsonString1 = "{\"address\":{\"city\":\"hangzhou\",\"street\":\"999 Main St\"},\"age\":18,\"hobbies\":[\"running\",\"traveling\"],\"isStudent\":true,\"name\":\"xiaolan\"}"; Json::Value root1; if (str2json(jsonString, root1)) { 
    std::cout << "root1: " << root1 << std::endl; // JSON 解析成功,可以访问解析后的数据 // std::string name = root1["name"].asString(); // int age = root1["age"].asInt(); // bool isStudent = root1["isStudent"].asBool(); // std::string street = root1["address"]["street"].asString(); // std::string city = root1["address"]["city"].asString(); // std::cout << "Name: " << name << std::endl; // std::cout << "Age: " << age << std::endl; // std::cout << "Is Student: " << (isStudent ? "true" : "false") << std::endl; // std::cout << "Street: " << street << std::endl; // std::cout << "City: " << city << std::endl; } // 字符串写入文件 str2file("tempfile.json", json2str(root1, true)); // 从文件当中读出来JSON std::string filePath = "tempfile.json"; Json::Value root2; if (file2json(filePath, root2)) { 
    std::cout << "root2: " << root2 << std::endl; // JSON 解析成功,可以访问解析后的数据 // std::string name = root2["name"].asString(); // int age = root2["age"].asInt(); // bool isStudent = root2["isStudent"].asBool(); // std::string street = root2["address"]["street"].asString(); // std::string city = root2["address"]["city"].asString(); // std::cout << "Name: " << name << std::endl; // std::cout << "Age: " << age << std::endl; // std::cout << "Is Student: " << (isStudent ? "true" : "false") << std::endl; // std::cout << "Street: " << street << std::endl; // std::cout << "City: " << city << std::endl; } return 0; } 
小讯
上一篇 2025-01-12 09:03
下一篇 2025-02-13 23:45

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/53888.html