C++ rapidjson 使用

C++ rapidjson 使用转 JSONrapidjso Documentdocu document SetObject 添加 name valueconstch name success url constchar value https www google com document AddMember rapidjson StringRef name rapidjson StringRef value document GetAll

转JSON

rapidjson::Document document; document.SetObject(); ​ // 添加name, value const char* name = "success_url"; const char* value = "https://www.google.com"; document.AddMember(rapidjson::StringRef(name), rapidjson::StringRef(value), document.GetAllocator()); ​ // 添加json object rapidjson::Value info_objects(rapidjson::kObjectType); std::string jsonObject = "json_object"; info_objects.AddMember(rapidjson::StringRef("class_room"), rapidjson::StringRef("NO. 6110"), document.GetAllocator()); info_objects.AddMember(rapidjson::StringRef("teacher_name"), rapidjson::StringRef("ZhangSanfeng"), document.GetAllocator()); document.AddMember(rapidjson::StringRef(jsonObject.c_str()), info_objects, document.GetAllocator()); ​ // 添加json array rapidjson::Value array_objects(rapidjson::kArrayType); for (int i = 0; i < 2; i++) { Value object(kObjectType); Value nobject(kNumberType); nobject.SetInt(i); object.AddMember(StringRef("id"), nobject, document.GetAllocator()); object.AddMember(StringRef("name"), StringRef("zhangsan"), document.GetAllocator()); array_objects.PushBack(object, document.GetAllocator()); } char * jsonArrayName = "jsonArrayName"; document.AddMember(rapidjson::StringRef(jsonArrayName), array_objects, document.GetAllocator()); ​ rapidjson::StringBuffer buffer; rapidjson::Writer<rapidjson::StringBuffer> writer(buffer); document.Accept(writer); std::string json = std::string(buffer.GetString()); LOGD("testAddMember = %s", json.c_str());

用法One: 简单修改json字符串

 

// 1. 把 JSON 解析至 DOM。 const char* json = "{\"project\":\"rapidjson\",\"stars\":10}"; Document d; d.Parse(json); // 2. 利用 DOM 作出修改。 Value& s = d["stars"]; s.SetInt(s.GetInt() + 1); // 3. 把 DOM 转换(stringify)成 JSON。 StringBuffer buffer; Writer<StringBuffer> writer(buffer); d.Accept(writer); // Output {"project":"rapidjson","stars":11} std::cout << buffer.GetString() << std::endl;
  

用法Two: 构造简单json

 StringBuffer s; Writer<StringBuffer> writer(s); writer.StartObject(); // Between StartObject()/EndObject(), writer.Key("hello"); // output a key, writer.String("world"); // follow by a value. writer.Key("t"); writer.Bool(true); writer.Key("f"); writer.Bool(false); writer.Key("n"); writer.Null(); writer.Key("i"); writer.Uint(123); writer.Key("pi"); writer.Double(3.1416); writer.Key("a"); writer.StartArray(); // Between StartArray()/EndArray(), for (unsigned i = 0; i < 4; i++) writer.Uint(i); // all values are elements of the array. writer.EndArray(); writer.EndObject(); // {"hello":"world","t":true,"f":false,"n":null,"i":123,"pi":3.1416,"a":[0,1,2,3]} std::cout << s.GetString() << std::endl;

 

原文链接:https://blog.csdn.net/u0/article/details/

 

解析复杂数据

{ "retType": 0, "s2c": { "basicQotList": [ { "security": { "market": 1, "code": "HSI2004" }, "isSuspended": false } } ] } }

获取basicQotList数组里面的security字段的market值

rapidjson::Document doc; doc.Parse(value.data()); if (!doc.HasParseError()) { if (doc.HasMember("retType") && doc["retType"].IsInt()) { if (doc["retType"].GetInt() == 0) { if (doc.HasMember("s2c") && doc["s2c"].IsObject()) { rapidjson::Value& s2c_object = doc["s2c"]; if (s2c_object.HasMember("basicQotList") && s2c_object["basicQotList"].IsArray()) { auto rsp_ = s2c_object["basicQotList"].GetArray(); for (size_t i = 0; i < rsp_.Size(); i++) // 遍历列表行情数据 { rapidjson::Value& v = rsp_[i]; // 转换市场编号信息 std::string key_ = ""; if (v.HasMember("security") && v["security"].IsObject()) { int market_ = v["security"]["market"].GetInt(); std::string code_ = v["security"]["code"].GetString(); std::string market_str = getMarketStr(market_); if (market_str == "Unknown") { LG_ERROR("Unknown market."<< market_); continue; } key_ = market_str + "." + code_; } } ... } } } } }

获取字段是对象的字符串值

{ "account":"www", "data":{"message":"123","erorcode":0} }

 

获取data字段的字符串值:”{“message”:”123″,”erorcode”:0}”

rapidjson::Document doc; doc.Parse(json.data()); if (!doc.HasParseError()) { if (doc.HasMember("Data") && doc["Data"].IsObject()) { rapidjson::StringBuffer sb; rapidjson::Writer<rapidjson::StringBuffer> writer(sb); doc["Data"].Accept(writer); std::string Data_ = sb.GetString(); } }
  

注意:

有一个小坑是在用 AddMember方法添加成员时。可以发现AddMember有7个重载类型。

GenericValue& AddMember(GenericValue& name, GenericValue& value, Allocator& allocator)

而第一个参数name,只有两种:StringRefType和GenericValue< Encoding, Allocator >

官方文档对于StringRefType的解释是:Reference to a constant string (引用的常量字符串)

所以若通过要传递的key是用户键入的变量,需要转成Value类型

即:

 Value robot_key(YD_Robot.toStdString().c_str(), allocator); //传递key变量

 docPtr.AddMember(robot_key, docCamera, allocator);

 

若传递固定的常量:

docPtr.AddMember(“xiaoming”, docCamera, allocator); 即可。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233949.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java源程序文件的扩展名_使用Java语言编写的源程序保存时的文件扩展名是什么…

    java源程序文件的扩展名_使用Java语言编写的源程序保存时的文件扩展名是什么…展开全部使用Java语言编写的源程序保存时的文件扩展名为“.java”。经过编译之后会生成62616964757a686964616fe58685e5aeb931333436316366“.class”为后缀的文件。源代码(也称源程序)是指未编译的按照一定的程序设计语言规范书写的文本文件,是一系列人类可读的计算机语言指令。计算机源程序的最终目的是将人类可读的文本翻译成为计算机可以执行的二进制指令,…

    2022年7月8日
    27
  • centos7 安装nginx 完整步骤「建议收藏」

    centos7 安装nginx 完整步骤「建议收藏」1.安装gccgcc是用来编译下载下来的nginx源码 yuminstallgcc-c++2、安装pcre和pcre-devel  PCRE(PerlCompatibleRegularExpressions)是一个Perl库,包括perl兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,pcre-devel是使用pcre开…

    2022年4月29日
    89
  • mysql读写分离原理详解(主从复制和读写分离)

    主库记录二进制日志。在每次准备提交事务完成数据更新前,主库将数据更新的事件记录到二进制日志中。MySQL会按事务提交的顺序而非每条语句的执行顺序来记录二进制日志。在记录二进制日志后,主库会告诉存储引擎可以提交事务了。下一步,备库将主库的二进制日志复制到其本地的中继日志中。首先,备库会启动一个工作线程,称为I/O线程,I/O线程跟主库建立一个普通的客户端连接,然后在主库启动一个特殊的二进制转储线程,…

    2022年4月10日
    34
  • Linux命令行大全

    Linux命令行大全#Linux命令行大全###第一部分学习shell####1shell是什么#####1.1终端仿真器#####1.2第一次键盘输入######1.2.1命令历史记录######

    2022年7月3日
    31
  • JAVA版位图排序(算法珠玑开篇的例子)

    JAVA版位图排序(算法珠玑开篇的例子)

    2021年5月8日
    126
  • 智能避障小车_单片机智能小车程序

    智能避障小车_单片机智能小车程序      接下来我对所用的模块以及小车的硬件部分做一个讲解        小车的总体效果图如下:      首先是模块简介:            1、首先就是L298N,这是一个经典的电机驱动,相信基本所有玩过单片机,玩过电机的人都使用过,它可以最高容忍15v电压输入,逻辑电平2.4-5.5v,所以使用单片机的3.3v完全可以驱动,它并没有PWM接口来控制电机的速度,只能使逻辑电平输出…

    2022年10月17日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号