C++第三方库【JSON】— jsoncpp

打印 上一主题 下一主题

主题 979|帖子 979|积分 2937

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目次
认识JSON
jsoncpp库 安装&使用
认识jsoncpp
Json::Value
jsoncpp序列化
jsoncpp反序列化


认识JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,接纳完全独立于编程语言的文本格式来存储和表示数据,常用于在客户端和服务器之间传输数据。
JSON由键值对组成,键必须是字符串,而值可以是字符串,布尔值,数组,对象或null
以下是一个简单的额JSON实例
在C/C++中,门生信息存储如下:
  1. //在C/C++中,小明的信息如下
  2. const char* name = "小明";
  3. int age = 18;
  4. float score[3] = {84.5, 90.5, 87};
复制代码
 使用JSON存储门生信息如下:
  1. {
  2.        "姓名" : "小明",
  3.        "年龄" : 18,
  4.        "成绩" : [84.5, 90.5, 87]
  5. }
复制代码

json数据范例:对象,数组,字符串,数字,布尔值,null
对象:使用大括号{ }括起来
数组:使用中括号[ ]括起来
字符串:使用双引号" "括起来
数字:包括整型和浮点型,直接使用,都视为数组
键和值之间使用冒号:分隔,差别键值对之间使用逗号,分隔。数组也可以存储对象,如下:
  1. [
  2.   {
  3.        "姓名" : "小明",
  4.        "年龄" : 18,
  5.        "成绩" : [84.5, 90.5, 87]
  6.   },
  7.   {
  8.        "姓名" : "小黑",
  9.        "年龄" : 17,
  10.        "成绩" : [88.5, 93, 85]
  11.   }
  12. ]
复制代码
jsoncpp库 安装&使用

Linux下安装需实行如下指令
  1. sudo yum install epel-release
  2. udo yum install jsoncpp-devel
  3. //如果成功查询到json的头文件和动静态库即为安装成功
  4. //查看json中的头文件
  5. [ljh@VM-12-11-centos practice]$ ls /usr/include/jsoncpp/json
  6. assertions.h  autolink.h  config.h  features.h  forwards.h  json.h  reader.h  value.h  version.h  writer.h
  7. //查看json的第三方库
  8. [ljh@VM-12-11-centos practice]$ ls /usr/lib64/libjson*
  9. /usr/lib64/libjsoncpp.so    /usr/lib64/libjsoncpp.so.0.10.5  /usr/lib64/libjson-c.so.2.0.1  /usr/lib64/libjson.so.0.1.0
  10. /usr/lib64/libjsoncpp.so.0  /usr/lib64/libjson-c.so.2        /usr/lib64/libjson.so.0
复制代码
使用时,包罗头文件需要指明路径,gcc/g++默认查询的路径是/usr/include,而json.h的路径为/usr/include/jsoncpp/json/json.h。需包罗头文件是#include <jsoncpp/json/json.h>
编译时需要链接jsoncpp库,需要加上-ljoncpp,如:
   g++ -o test test.cc -std=c++11 -ljsoncpp
  认识jsoncpp

jsoncpp是用于C++的JSON剖析库,提供了简单易用的API来剖析和生成JSON数据
最常用的是json格式的序列化和反序列化,完成将多个数据对象构造层json格式字符串,以及将json格式字符串剖析得到多个数据对象的功能
Json::Value

Json::Value是JSON数据的通用范例。可以表示JSON对象,数组,字符串,数字,布尔值和null等各种范例
  1. //Json数据对象类
  2. class Json::Value{
  3.     //Value重载了[]和=,因此所有的赋值和获取数据都可以通过
  4.    Value &operator=(const Value &other);
  5.    Value& operator[](const std::string& key);//示例:val["姓名"] = "小明";
  6.    Value& operator[](const char* key);
  7.     //移除元素
  8.    Value removeMember(const char* key);
  9.     //访问数组元素
  10.    const Value& operator[](ArrayIndex index) const; //示例:val["成绩"][0]
  11.     //添加数组元素
  12.    Value& append(const Value& value);//示例:val["成绩"].append(88);
  13.     //获取数组元素个数
  14.    ArrayIndex size() const;//示例:val["成绩"].size();
  15.     //访问数据,以string类型返回
  16.    std::string asString() const;//示例:string name = val["name"].asString();
  17.     //访问数据,以const char*类型返回
  18.    const char* asCString() const;//示例:char *name = val["name"].asCString();
  19.     //访问数据,以int类型返回
  20.    Int asInt() const;//示例:int age = val["age"].asInt();
  21.     //访问数据,以float类型返回
  22.    float asFloat() const;
  23.     //访问数据,以bool类型返回
  24.    bool asBool() const;
  25. };
复制代码
jsoncpp序列化

序列化是将Json::Value转换成json格式的字符串
  1. //json序列化类,低版本用这个更简单
  2. class JSON_API Writer {
  3.  virtual std::string write(const Value& root) = 0;
  4. }
  5. class JSON_API FastWriter : public Writer {
  6.  virtual std::string write(const Value& root);
  7. }
  8. class JSON_API StyledWriter : public Writer {
  9.  virtual std::string write(const Value& root);
  10. }
  11. //json序列化类,高版本推荐,如果用低版本的接口可能会有警告
  12. class JSON_API StreamWriter {
  13.    virtual int write(Value const& root, std::ostream* sout) = 0;
  14. }
  15. class JSON_API StreamWriterBuilder : public StreamWriter::Factory {
  16.    virtual StreamWriter* newStreamWriter() const;
  17. }
复制代码
建议使用高版本。


  • StreamWriter类的write接口可以将Json::Value对象转换为Json格式的字符串,借由sout输出传播出
  • 由于StreamWriter是抽象类,不能直接定义对象,需要先定义StreamWriterBuilder对象,再通过newStreamWriter接口获取StreamWriter对象,再使用writer接口
示例

  • 将全部数据保存在Json::Value对象中
  • 使用StreamWriter的write接口,完成序列化
  • 通过sout输出流获取json格式字符串
  1. #include <iostream>
  2. #include <memory>
  3. #include <sstream>
  4. #include <jsoncpp/json/json.h>
  5. //测试序列化
  6. void serialization()
  7. {
  8.     const char* name = "张三";
  9.     int age = 26;
  10.     float score[] = {84, 77.5, 88.3};
  11.     //将所有数据保存到Json::Value中
  12.     Json::Value root;
  13.     root["姓名"] = name;
  14.     root["年龄"] = age;
  15.     //数组要使用append
  16.     root["成绩"].append(score[0]);
  17.     root["成绩"].append(score[1]);
  18.     root["成绩"].append(score[2]);
  19.     //序列化
  20.     std::stringstream ss;
  21.     Json::StreamWriterBuilder swb;
  22.     std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());
  23.     sw->write(root, &ss);
  24.     //通过输出流获取json格式字符串
  25.     std::cout << ss.str() << std::endl;
  26. }
  27. int main()
  28. {
  29.     serialization();
  30.     return 0;
  31. }
复制代码
通过打印表现json格式字符串

jsoncpp反序列化

反序列化是将json格式字符串转化成Json::Value对象,此中存储了各项数据
  1. //json反序列化类,低版本用起来更简单
  2. class JSON_API Reader {
  3. bool parse(const std::string& document, Value& root, bool collectComments = true);
  4. }
  5. //json反序列化类,高版本更推荐
  6. class JSON_API CharReader {
  7.    virtual bool parse(char const* beginDoc, char const* endDoc,
  8.                       Value* root, std::string* errs) = 0;
  9. }
  10. class JSON_API CharReaderBuilder : public CharReader::Factory {
  11.    virtual CharReader* newCharReader() const;
  12. }
复制代码
建议使用高版本。


  • CharReader中的parse实现反序列化逻辑:beginDoc和endDoc是需要转化的json格式字符串的起始地址和结束地址;root是输出型参数;如果反序列化堕落,会返回false,并将错误信息存放在errs中
  • 同样,CharReader是抽象类,不能直接定义对象,借由CharReaderBuilder获取CharReader对象
示例

  • 预备json格式字符串
  • 获取CharReader对象,使用parse反序列化
  • 通过转化范例接口打印Json::Value
  1. #include <iostream>
  2. #include <memory>
  3. #include <sstream>
  4. #include <jsoncpp/json/json.h>
  5. //反序列化
  6. void deserialization()
  7. {
  8.     //C++11新特性 R
  9.     //R后的字符串,其中()括起来的任何字符都表示其本意,省略转义字符,如\就是字符\
  10.     std::string str = R"({"姓名":"张三", "年龄":22, "成绩":[88, 78.4, 92.7]})";//Json字符串
  11.     Json::Value root;//Json的Value
  12.     Json::CharReaderBuilder crb;
  13.     std::unique_ptr<Json::CharReader> cr(crb.newCharReader());
  14.     std::string err;//错误信息
  15.     bool ret = cr->parse(str.c_str(), str.c_str() + str.size(), &root, &err);
  16.     if(ret == false){
  17.         std::cout << "Json CharReader 解析错误\n";
  18.         exit(-1);
  19.     }
  20.     //打印Value信息
  21.     std::cout << "姓名: " << root["姓名"].asString() << std::endl;
  22.     std::cout << "姓名: " << root["年龄"].asInt() << std::endl;
  23.     size_t len = root["成绩"].size();
  24.     std::cout << "成绩: ";
  25.     for(int i = 0; i < len; ++i)
  26.         std::cout << root["成绩"][i] << " ";
  27.     std::cout << std::endl;
  28. }
  29. int main()
  30. {
  31.     deserialization();
  32.     return 0;
  33. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

渣渣兔

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表