jsoncpp库

前端之家收集整理的这篇文章主要介绍了jsoncpp库前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

JSON的全称为:JavaScript Object Notation,顾名思义,JSON是用于标记Javascript对象的,JSON官方的解释为:JSON是一种轻量级的数据传输格式。本文并不详细介绍JSON本身的细节,旨在记录及介绍如何使用C++语言来处理JSON


方法一:使用Jsoncpp生成的lib文件
解压上面下载的Jsoncpp文件,在jsoncpp-src-0.5.0/makefiles/vs71目录里找到jsoncpp.sln,用VS2008版本编译,默认生成静态链接库。 在工程中引用,只需要包含include/json下的头文件生成的.lib文件即可。
如何包含lib文件:在.cpp文件#pragma comment(lib."json_vc71_libmt.lib"),在工程属性中Linker下Input中Additional Dependencies写入lib文件名字(Release下为json_vc71_libmt.lib,Debug为json_vc71_libmtd.lib

注意:Jsoncpp的lib工程编译选项要和VS工程中的编译选项保持一致。如lib文件工程编译选项为MT(或MTd),VS工程中也要选择MT(或MTd),否则会出现编译错误问题,debug和release下生成的lib文件名字不同,注意不要看错了,当成一个文件来使用(我就犯了这个错误)。

方法二:使用Jsoncpp包中的.cpp.h文件
文件,把jsoncpp-src-0.5.0文件拷贝到工程目录下,jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\include\jsonjsoncpp-src-0.5.0\jsoncpp-src-0.5.0\src\lib_json目录里的文件包含到VS工程中,在VS工程的属性C/C++下General中Additional Include Directories包含头文件目录.\jsoncpp-src-0.5.0\include。在使用的cpp文件包含json头文件即可,如:#include "json/json.h"。将json_reader.cpp、json_value.cpp和json_writer.cpp三个文件的Precompiled Header属性设置为Not Using Precompiled Headers否则编译会出现错误

使用JsonCPP库处理

Jsoncpp是个跨平台的开源库,首先从https://github.com/open-source-parsers/jsoncpp 上下载jsoncpp库源码。关于Jsoncpp代码的编译这里就不多说了,在jsoncpp/makefiles/目录里有msvc2010和vs71两个文件夹,根据windows本地安装的编译器,找到相应目录下的jsoncpp.sln,双击打开运行,默认生成静态链接库。 在工程中引用,只需要include/json及.lib文件即可。当然,也可以直接将源码文件加入到自己的工程目录下,跟随你的源码一起编译到程序里面,这样也相当于实现了跨平台

JsonCPP类简介

jsoncpp中所有对象、类名都在namespace Json中,包含json.h即可。Jsoncpp主要包含以下三个类:

  • Json::Value 是jsoncpp中最基本、最重要的类,用于表示各种类型的对象,jsoncpp支持的对象类型可见Json::ValueType枚举值。Json::Value 只能处理 ANSI 类型的字符串,如果 C++ 程序是用 Unicode 编码的,最好加一个 Adapt 类来适配。
  • Json::Reader 将json文件流或字符串解析到Json::Value,主要函数有Parse。
  • Json::Writer 与Json::Reader相反,将Json::Value转化成字符串流,由于Json::Writer类是一个纯虚类,并不能直接使用,我们使用它的两个子类:Json::FastWriter和Json::StyleWriter,分别输出不带格式的json和带格式的json。

a) 将信息保存为Json格式

  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. #include "json/json.h"
  5.  
  6. using namespace std;
  7.  
  8. int main() {
  9. //根节点
  10. Json::Value root;
  11.  
  12. //根节点属性
  13. root["name"] = Json::Value("Tsybius");
  14. root["age"] = Json::Value(23);
  15. root["sex_is_male"] = Json::Value(true);
  16.  
  17. //子节点
  18. Json::Value partner;
  19.  
  20. //子节点属性
  21. partner["partner_name"] = Json::Value("Galatea");
  22. partner["partner_age"] = Json::Value(21);
  23. partner["partner_sex_is_male"] = Json::Value(false);
  24.  
  25. //子节点挂到根节点上
  26. root["partner"] = Json::Value(partner);
  27.  
  28. //数组形式
  29. root["achievement"].append("ach1");
  30. root["achievement"].append("ach2");
  31. root["achievement"].append("ach3");
  32.  
  33. //直接输出控制台
  34. cout << "FastWriter:" << endl;
  35. Json::FastWriter fw;
  36. cout << fw.write(root) << endl << endl;
  37.  
  38. //缩进输出到控制台
  39. cout << "StyledWriter:" << endl;
  40. Json::StyledWriter sw;
  41. cout << sw.write(root) << endl << endl;
  42.  
  43. //输出文件
  44. ofstream os;
  45. os.open("PersonalInfo");
  46. os << sw.write(root);
  47. os.close();
  48.  
  49. return 0;
  50. }

控制台输出信息如下:


控制台输出

生成的PersonalInfo文件内容如下:

  1. {
  2. "achievement" : [ "ach1","ach2","ach3" ],"age" : 23,"name" : "Tsybius","partner" : { "partner_age" : 21,"partner_name" : "Galatea","partner_sex_is_male" : false },"sex_is_male" : true }

b) 从字符串中解析Json

  1. #include <iostream>
  2.  
  3. #include "json/json.h"
  4.  
  5. using namespace std;
  6.  
  7. int main() {
  8. //字符串
  9. const char* str =
  10. "{\"praenomen\":\"Gaius\",\"nomen\":\"Julius\",\"cognomen\":\"Caezar\","
  11. "\"born\":-100,\"died\":-44}";
  12.  
  13. Json::Reader reader;
  14. Json::Value root;
  15.  
  16. //从字符串中读取数据
  17. if(reader.parse(str,root))
  18. {
  19. string praenomen = root["praenomen"].asString();
  20. string nomen = root["nomen"].asString();
  21. string cognomen = root["cognomen"].asString();
  22. int born = root["born"].asInt();
  23. int died = root["died"].asInt();
  24.  
  25. cout << praenomen + " " + nomen + " " + cognomen
  26. << " was born in year " << born
  27. << ",died in year " << died << endl;
  28. }
  29.  
  30. return 0;
  31. }

c) 从文件中解析Json
待解析的Json格式文件如下:

  1. {
  2. "name":"Tsybius","age":23,"sex_is_male":true,"partner":
  3. { "partner_name":"Galatea","partner_age":21,"partner_sex_is_male":false },"achievement":["ach1","ach3"] }

解析Json文件代码如下:

  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. #include "json/json.h"
  5.  
  6. using namespace std;
  7.  
  8. int main() {
  9. Json::Reader reader;
  10. Json::Value root;
  11.  
  12. //从文件中读取
  13. ifstream is;
  14. is.open("PersonalInfo.json",ios::binary);
  15.  
  16. if(reader.parse(is,root))
  17. {
  18. //读取根节点信息
  19. string name = root["name"].asString();
  20. int age = root["age"].asInt();
  21. bool sex_is_male = root["sex_is_male"].asBool();
  22.  
  23. cout << "My name is " << name << endl;
  24. cout << "I'm " << age << " years old" << endl;
  25. cout << "I'm a " << (sex_is_male ? "man" : "woman") << endl;
  26.  
  27. //读取子节点信息
  28. string partner_name = root["partner"]["partner_name"].asString();
  29. int partner_age = root["partner"]["partner_age"].asInt();
  30. bool partner_sex_is_male = root["partner"]["partner_sex_is_male"].asBool();
  31.  
  32. cout << "My partner's name is " << partner_name << endl;
  33. cout << (partner_sex_is_male ? "he" : "she") << " is "
  34. << partner_age << " years old" << endl;
  35.  
  36. //读取数组信息
  37. cout << "Here's my achievements:" << endl;
  38. for(int i = 0; i < root["achievement"].size(); i++)
  39. {
  40. string ach = root["achievement"][i].asString();
  41. cout << ach << '\t';
  42. }
  43. cout << endl;
  44.  
  45. cout << "Reading Complete!" << endl;
  46. }
  47.  
  48. is.close();
  49.  
  50. return 0;
  51. }

d) 向文件中插入Json数据

  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. #include "json/json.h"
  5.  
  6. using namespace std;
  7.  
  8. int main() {
  9. Json::Reader reader;
  10. Json::Value root;
  11.  
  12. //从文件中读取
  13. ifstream is;
  14. is.open("PersonalInfo.json",root))
  15. {
  16. Json::Value arrayObj = root["achievement"]; // 构建对象
  17. Json::Value new_item,new_item1;
  18. new_item["date"] = "2011-11-11";
  19. new_item1["time"] = "11:11:11";
  20. arrayObj.append(new_item); // 插入数组成员
  21. arrayObj.append(new_item1); // 插入数组成员
  22.  
  23. std::string out = root.toStyledString();
  24. // 输出无格式json字符串
  25. Json::FastWriter writer;
  26. std::string strWrite = writer.write(root);
  27. std::ofstream ofs;
  28. ofs.open("test_write.json");
  29. ofs << strWrite;
  30. ofs.close();
  31. cout << "Insert Complete!" << endl;
  32. }
  33.  
  34. is.close();
  35.  
  36. return 0;
  37. }

总结

  • 关于解析为布尔类型问题:
    写入数值0,解析为布尔类型false,其他数值解析为true
    写入空字符串,解析为布尔类型false,其他字符串均解析为true
  • 关于解析为数值类型的问题:
    写入布尔类型,true解析为1,false解析为0
    写入字符串类型,解析会crash
  • 关于解析为字符串类型的问题:
    写入布尔类型,true解析为“true”,false解析为“false”
    写入数值类型,解析会crash

参考链接
C++ 解析Json——jsoncpp
C++解析JSON的好文章
C++的Json解析库:jsoncpp和boost
C++ JSON文件的读取和生成



文/drybeans(简书作者) 原文链接:http://www.jianshu.com/p/62fa72a1ae18 著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

猜你在找的Json相关文章