JSON

使用jsoncpp解析JSON数据

字号+ 作者:H5之家 来源:H5之家 2015-11-02 13:01 我要评论( )

上节《JSON数据格式》中我们讲到了JSON的数据格式和一些应用的地方,接着上面的说下去,jsoncpp和boost.property_tree都可以解析JSON文件,我们先将jsoncpp如何解

使用jsoncpp解析JSON数据

上节《JSON数据格式》中我们讲到了JSON的数据格式和一些应用的地方,接着上面的说下去,jsoncpp和boost.property_tree都可以解析JSON文件,我们先将jsoncpp如何解析。

1.jsoncpp

jsoncpp

是什么?

jsoncpp是一个使用C++语言来解析json文件的开源库,其项目地址为:,属于免费项目,任何人都可以下载使用

2. 编译jsoncpp

jsoncpp文件中提供了vs71的工程文件以及makerelease.py文件,用来编译,里面分为jsontest、lib_json、test_lib_json三个工程,按照自己需要的编译。

注意:如果使用VS默认的编译选项MTd或者MT,在使用json_libmtd.lib的时候可能会出现LNK2038错误(我使用的VS2012 vc110环境)所以请修改MTD为MDd,MT为MD

3.使用jsoncpp读JSON文件

如何将lib库添加进VS工程中在此就不赘述了。先看第一个读文件的例

// JSON文件 {"address":[ {"name":"eliteYang", "email":"elite_yang@163.com"}, {"name":"AAA", "email":"aaa@163.com"}, {"name":"BBB", "email":"bbb@163.com"} ]}/** * file : jsoncpp_test.cpp * author : eliteYang * email : elite_yang@163.com * blog : * desc : json cpp test */ #include <fstream> #include <string> #include "jsoncpp/json.h" int _tmain(int argc, _TCHAR* argv[]) { std::ifstream ifs; ifs.open("test.json"); Json::Reader reader; Json::Value root; if (!reader.parse(ifs, root, false)) { return -1; } Json::Value add_value = root["address"]; for (int i = 0; i < add_value.size(); ++i) { Json::Value temp_value = add_value[i]; std::string strName = temp_value["name"].asString(); std::string strMail = temp_value["email"].asString(); std::cout << "name: " << strName << " email: " << strMail << std::endl; // use value array[index] //Json::Value temp_value = add_value[i]; //std::string strName = add_value[i]["name"].asString(); //std::string strMail = add_value[i]["email"].asString(); //std::cout << "name: " << strName << " email: " << strMail << std::endl; } system("Pause"); return 0; }

结果:

name: eliteYang email: elite_yang@163.com name: AAA email: aaa@163.com name: BBB email: bbb@163.com 请按任意键继续. . .

跟我们文件中的数据完全一致。

4.使用JSON

JSON

写入一块数据

我们继续使用上述文件,在中间加上一块数据。我们插入一个新的{"name": "append", "email": "append@163.com"}

/** * file : jsoncpp_test.cpp * author : eliteYang * email : elite_yang@163.com * blog : * desc : json cpp test */ #include <fstream> #include <string> #include "jsoncpp/json.h" int _tmain(int argc, _TCHAR* argv[]) { std::ifstream ifs; ifs.open("test.json"); Json::Reader reader; Json::Value root; if (!reader.parse(ifs, root, false)) { return -1; } Json::Value& add_value = root["address"]; Json::Value append_value; append_value["name"] = "append"; append_value["email"] = "append@163.com"; add_value.append(append_value); for (int i = 0; i < add_value.size(); ++i) { Json::Value temp_value = add_value[i]; std::string strName = temp_value["name"].asString(); std::string strMail = temp_value["email"].asString(); std::cout << "name: " << strName << " email: " << strMail << std::endl; } Json::FastWriter writer; std::string json_append_file = writer.write(root); std::ofstream ofs; ofs.open("test_append.json"); ofs << json_append_file; system("Pause"); return 0; }

结果:

name: eliteYang email: elite_yang@163.com name: AAA email: aaa@163.com name: BBB email: bbb@163.com name: append email: append@163.com 请按任意键继续. . .// test_append.json {"address":[{"email":"elite_yang@163.com","name":"eliteYang"},{"email":"aaa@163.com","name":"AAA"},{"email":"bbb@163.com","name":"BBB"},{"email":"append@163.com","name":"append"}]}

当然了,jsoncpp对数组的解析也支持STL中迭代器的风格,不过我个人觉得还是数组好理解一些。迭代器的解析风格就不写了,大家可以自己摸索下,主要是使用Json::Value::Members。

JSON官方还是非常推荐用jsoncpp来

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  •  JSON入门级学习总结-JSON数据结构

    JSON入门级学习总结-JSON数据结构

    2016-02-25 11:05

  • ASP.NET Web API 2 返回 Json格式

    ASP.NET Web API 2 返回 Json格式

    2016-02-10 17:18

  • php json时间格式转换

    php json时间格式转换

    2016-02-08 11:48

  • Android中JSON数据格式读取解析创建视频教程

    Android中JSON数据格式读取解析创建视频教程

    2016-02-05 19:00

网友点评
n