背景
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它已经成为了互联网上广泛使用的数据交换格式之一。在Web开发、移动应用开发以及各种数据交换场景中,JSON都扮演着重要的角色。为了在C++中更方便地处理JSON数据,出现了很多优秀的开源库,jsoncpp在诸多开源库中一枝独秀。
概述
jsoncpp它提供了简洁而强大的API,使得在C++中解析和生成JSON数据变得非常便捷。尤其是在其轻量级、跨平台、简洁等特性的加持下,进一步扩大了其影响力。
使用
下载和安装
jsoncpp的下载地址(https://github.com/open-source-parsers/jsoncpp)下载源码,然后编译生成静态库或动态库,或者直接将源代码集成到项目中。编译生成静态库或动态库需要依赖cmake,该部分的讲解已汗牛充栋,在此不再赘述。建议直接将源码集成到自己的项目中,不仅方便调试,还可以减少依赖库的数量。后文以集成源码到项目的形式讲解。
jsoncpp提供了python脚本,用于自动筛选在使用源码集成时需要的文件。操作如下:
则会在jsoncpp的的文件夹内生成dist文件夹,内含源码集成时所必需的文件,如下图,
由上图可知,源码集成时,其依赖2个头文件,一个源文件。
代码示例
待生成和解析的json字符串如下
{
"address" :
{
"city" : "Beijing",
"country" : "China"
},
"age" : 30,
"is_student" : false,
"name" : "夏利",
"subjects" :
[
{
"name" : "Chinese",
"score" : 89
},
{
"name" : "English",
"score" : 72
},
{
"name" : "Math",
"score" : 68
}
]
}
使用jsoncpp生成json字符串
#include<iostream>
#include"./dist/json/json.h"
constexprint subject_num=3;
std::string subject_name[subject_num]={"Chinese","English","Math"};
intsubject_score[subject_num] = { 89,72,68 };
std::string using_write()
{
Json::Value root;
root["name"]="夏利";
root["age"]=30;
root["is_student"]=false;
for (size_t i = 0; i < subject_num; i++)
{
//数组
Json::Value item;
item["name"] = subject_name[i];
item["score"] = subject_score[i];
root["subjects"].append(item);
}
//添加对象
Json::Value address;
address["city"] = "Beijing";
address["country"] = "China";
root["address"]=address;
Json::StreamWriterBuilder writebuild;
writebuild["emitUTF8"] = true;//解决中文乱码问题
auto s = Json::writeString(writebuild, root);
return s;
}
使用jsoncpp解析json字符串
int using_read()
{
const std::string json_data = std::string(
"{ \"address\" :
{
\"city\" : \"Beijing\",
\"country\" : \"China\"
},\
\"age\" : 30,\
\"is_student\" : false,\
\"name\" : \"夏利\",\
\"subjects\" :\
[\
{\
\"name\" : \"Chinese\",\
\"score\" : 89 \
},\
{\
\"name\" : \"English\",\
\"score\" : 72 \
},\
{\
\"name\" : \"Math\",\
\"score\" : 68\
}\
]\
}");
Json::Value root;
Json::Reader reader;
bool parsing_successful = reader.parse(json_data, root);
if (!parsing_successful) {
std::cerr << "Failed to parse JSON data: " << reader.getFormattedErrorMessages() << std::endl;
return -1;
}
std::string name = root["name"].asString();
int age = root["age"].asInt();
bool is_student = root["is_student"].asBool();
std::string city = root["address"]["city"].asString();
std::string country = root["address"]["country"].asString();
auto is_obj = root["address"].isObject();
auto subs = root["subjects"];
for (auto sub : subs)
{
std::cout<<"\n"<<sub["name"].asString()<<"\t";
std::cout << sub["score"].asInt();
}
}
总结
jsoncpp 是一个在C++中处理JSON数据的优秀库,它提供了简单易用的API,使得在C++中解析和生成JSON数据变得非常方便。通过 jsoncpp,我们可以轻松地处理JSON数据,应用于各种场景中,包括Web开发、移动应用开发以及配置文件等。如果你需要在C++项目中处理JSON数据,不妨尝试一下 jsoncpp。