C++解析Json,使用JsonCpp读写Json数据

JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。通常用于数据交换或存储。

JsonCpp是一个基于C++语言的开源库,用于C++程序的Json数据的读写操作。

JsonCpp是一个开源库

下载地址:https://github.com/open-source-parsers/jsoncpp

文档地址:http://open-source-parsers.github.io/jsoncpp-docs/doxygen/index.html

使用

官方提供的集成方案:https://github.com/open-source-parsers/jsoncpp/wiki/Amalgamated

其中最简单的方法是执行项目根目录中的python脚本,构建头文件和源文件。

1. 在安装Python环境的控制台中进入jsoncpp项目根目录,

2. 执行命令:

python amalgamate.py

3. 将生成的dist目录拷贝到自己的项目中,其中包源文件jsoncpp.cpp和头文件json.h、json-forwards.h。

基本类和方法

使用jsoncpp库时需要包含头文件#include <json/json.h>(包含目录根据需要修改)

方法命名空间:Json

常用类

Value:用于存储Json数据

CharReader:从字符串中读取Json数据的抽象类

CharReaderBuilder:CharReader类的实现,可以读取标准输入流中的数据

Demo

定义Json数据结构,并输出数据

Json::Value jsonRoot; //定义根节点
Json::Value jsonItem; //定义一个子对象
jsonItem["item1"] = "one"; //添加数据
jsonItem["item2"] = 2;
jsonRoot.append(jsonItem); 
jsonItem.clear(); //清除jsonItem
jsonItem["item1.0"] = 1.0; jsonItem["item2.0"] = 2.0; jsonRoot["item"] = jsonItem; cout << jsonRoot.toStyledString() << endl; //输出到控制台

将Json写入到文件

ofstream ofs; //标准输出流
ofs.open("sample.json"); //创建文件
ofs << jsonRoot.toStyledString(); //输出
ofs.close();

从文件读取Json数据

ifstream ifs; //标准输入流
ifs.open("sample.json");
jsonRoot.clear();
Json::CharReaderBuilder builder; builder["collectComments"] = false; JSONCPP_STRING errs; if (!parseFromStream(builder, ifs, &jsonRoot, &errs)) //从ifs中读取数据到jsonRoot { return; }

从字符串读取Json数据

string jsonStr = jsonRoot.toStyledString(); //json字符串
jsonRoot.clear();
Json::CharReaderBuilder builder; builder["collectComments"] = false; JSONCPP_STRING errs; Json::CharReader* reader = builder.newCharReader(); if (!reader->parse(jsonStr.data(), jsonStr.data() + jsonStr.size(), &jsonRoot, &errs)) //从jsonStr中读取数据到jsonRoot { return; }

获取Json中的键值对

for (auto i = 0; i < jsonRoot.size(); i++)//遍历数组[]
{
    for (auto sub= jsonRoot[i].begin(); sub != jsonRoot[i].end(); sub++)//遍历对象{}
    {
        cout << sub.name() << " : " << jsonRoot[i][sub.name()] << endl; //方法1
cout << sub.name() << " : " << (*sub) << endl; //方法2
} }
eg:
jsonRoot= [ { "item1" : 1, "item2" : 2, }, { "a" : "a", "b" : 2.0, } ]