在C++环境中使用JsonCpp读写Json数据

Posted esCharacter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C++环境中使用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;
    }
}

 





以上是关于在C++环境中使用JsonCpp读写Json数据的主要内容,如果未能解决你的问题,请参考以下文章

第三方库 jsoncpp 读写json

详解将jsoncpp编译so库,进行封装和解析JSON数据

如何在 Linux 上的 C++ 程序中使用共享库(在本例中为 JsonCpp)?

c++ JsonCpp Parse对Json字符串解析转换判断的补充 Json格式验证

C++ jsoncpp解析二维数组

JsonCpp解析和读写Json字符串