一、jsoncpp简介
JsonCpp是一个开源的C++库,用于解析和生成JSON(JavaScript Object
Notation)数据格式。JSON是一种轻量级的数据交换格式,广泛用于各种应用程序和网络服务中。
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)
Amalgamated source
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来生成的,以防止包含其他头文件。
大概意思就是如果我们要是jsonCpp的库,实际上就是需要将jsoncpp.cpp,json.h,json-forwards.h添加到我们的项目当中。
那我们怎么样获得这三个文件?
下载后找到下面文件
在当前目录下打开终端,执行下面的命令
python amalgamate.py
你就可以在当前目录下找到dist目录,里面就有我们需要的三个文件
我们终于可以使用它了
三、具体应用
Json格式简介
JSON(JavaScript Object
Notation)是一种轻量级的数据交换格式,常用于在不同系统之间传输和存储数据。它具有以下特点:
可读性: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;
}
参考:
最新版 JsonCpp 的下载、编译、及使用