• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

技术天地

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

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/2019/0912/637.html

 
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,
    }
]
 
复制代码

上篇:上一篇:C++模仿Http/Https POST登录web站点
下篇:下一篇:C++运用JsonCpp解析Json数据