rapidjson库的基本使用

rapidjson库的基本使用我在工作中一直使用的是 rapidjson 库 这是我在工作中使用该库作的一些整理 以读写下面的这段 json 字符串为例来进行整理 该字符串覆盖了平时使用的布尔类型 整型 浮点类型 结构体类型 字符串类型以及相对应的数组类型

我在工作中一直使用的是rapidjson库,这是我在工作中使用该库作的一些整理,以读写下面的这段json字符串为例来进行整理,该字符串覆盖了平时使用的布尔类型、整型、浮点类型、结构体类型、字符串类型以及相对应的数组类型。

代码地址:https://git.oschina.net/zhaoyf/zhaoyf_csdn/tree/master/test_json

这时生成的目标json字符串

{ "Int": 1, "Double": 12.0000001, "String": "This is a string", "Object": { "name": "", "age": 25 }, "IntArray": [ 10, 20, 30 ], "DoubleArray": [ 1, 2, 3 ], "StringArray": [ "one", "two", "three" ], "MixedArray": [ "one", 50, false, 12.005 ], "People": [ { "name": "", "age": 0, "sex": true }, { "name": "", "age": 10, "sex": false }, { "name": "", "age": 20, "sex": true } ] }

一、写json协议

1. 下面这段代码是我最喜欢用的一种方式,使用字符串缓冲器生成

#include "rapidjson/stringbuffer.h" #include "rapidjson/writer.h" #include 
   
     #include 
    
      using namespace std; void Serialize_1() { rapidjson::StringBuffer strBuf; rapidjson::Writer 
     
       writer(strBuf); writer.StartObject(); //1. 整数类型 writer.Key("Int"); writer.Int(1); //2. 浮点类型 writer.Key("Double"); writer.Double(12.0000001); //3. 字符串类型 writer.Key("String"); writer.String("This is a string"); //4. 结构体类型 writer.Key("Object"); writer.StartObject(); writer.Key("name"); writer.String(""); writer.Key("age"); writer.Int(25); writer.EndObject(); //5. 数组类型 //5.1 整型数组 writer.Key("IntArray"); writer.StartArray(); //顺序写入即可 writer.Int(10); writer.Int(20); writer.Int(30); writer.EndArray(); //5.2 浮点型数组 writer.Key("DoubleArray"); writer.StartArray(); for(int i = 1; i < 4; i++) { writer.Double(i * 1.0); } writer.EndArray(); //5.3 字符串数组 writer.Key("StringArray"); writer.StartArray(); writer.String("one"); writer.String("two"); writer.String("three"); writer.EndArray(); //5.4 混合型数组 //这说明了,一个json数组内容是不限制类型的 writer.Key("MixedArray"); writer.StartArray(); writer.String("one"); writer.Int(50); writer.Bool(false); writer.Double(12.005); writer.EndArray(); //5.5 结构体数组 writer.Key("People"); writer.StartArray(); for(int i = 0; i < 3; i++) { writer.StartObject(); writer.Key("name"); writer.String(""); writer.Key("age"); writer.Int(i * 10); writer.Key("sex"); writer.Bool((i % 2) == 0); writer.EndObject(); } writer.EndArray(); writer.EndObject(); string data = strBuf.GetString(); cout << data << endl; } 
      
     
   

2. 接下来这种方式是我刚开始学习使用该库时网上收到的结果,使用不像上面那么方便

#include "rapidjson/document.h" #include "rapidjson/stringbuffer.h" #include "rapidjson/writer.h" void Serialize_2() { rapidjson::Document doc; doc.SetObject(); rapidjson::Document::AllocatorType& allocator = doc.GetAllocator(); //1. 整型类型 doc.AddMember("Int", 1, allocator); //2. 浮点类型 doc.AddMember("Double", 12.00001, allocator); //3. 字符串类型 //正确方式 string str= "This is a string"; rapidjson::Value str_value(rapidjson::kStringType); str_value.SetString(str.c_str(), str.size()); if(!str_value.IsNull()) { doc.AddMember("String", str_value, allocator); } / * 注:以下方式不正确,可能成功,也可能失败,因为字符串写入json要重新开辟内存, * 如果使用该方式的话,当数据是字符串常量的话是没问题的,如果为变量就会显示乱码,所 * 以为保险起见,我们显式的分配内存(无需释放) */ //doc.AddMember("String", str.data(), allocator); //4. 结构体类型 rapidjson::Value object(rapidjson::kObjectType); object.AddMember("name", "", allocator); //注:常量是没有问题的 object.AddMember("age", 25, allocator); doc.AddMember("Object", object, allocator); //5. 数组类型 //5.1 整型数组 rapidjson::Value IntArray(rapidjson::kArrayType); IntArray.PushBack(10, allocator); IntArray.PushBack(20, allocator); IntArray.PushBack(30, allocator); doc.AddMember("IntArray", IntArray, allocator); //5.2 浮点型数组 rapidjson::Value DoubleArray(rapidjson::kArrayType); DoubleArray.PushBack(1.0, allocator); DoubleArray.PushBack(2.0, allocator); DoubleArray.PushBack(3.0, allocator); doc.AddMember("DoubleArray", DoubleArray, allocator); //5.3 字符型数组 rapidjson::Value StringArray(rapidjson::kArrayType); string strValue1 = "one"; string strValue2 = "two"; string strValue3 = "three"; str_value.SetString(strValue1.c_str(), strValue1.size()); StringArray.PushBack(str_value, allocator); str_value.SetString(strValue2.c_str(), strValue2.size()); StringArray.PushBack(str_value, allocator); str_value.SetString(strValue3.c_str(), strValue3.size()); StringArray.PushBack(str_value, allocator); doc.AddMember("StringArray", StringArray, allocator); //5.4 结构体数组 rapidjson::Value ObjectArray(rapidjson::kArrayType); for(int i = 1; i < 4; i++) { rapidjson::Value obj(rapidjson::kObjectType); obj.AddMember("name", "", allocator);//注:常量是没有问题的 obj.AddMember("age", i * 10, allocator); ObjectArray.PushBack(obj, allocator); } doc.AddMember("ObjectArray", ObjectArray, allocator); rapidjson::StringBuffer strBuf; rapidjson::Writer 
      
        writer(strBuf); doc.Accept(writer); string data = strBuf.GetString(); cout << data << endl; } 
      

下面是解析的代码,同样的,采用的依旧上面那个json字符串,分门别类的已经整理好

#include "rapidjson/document.h" #include "rapidjson/stringbuffer.h" #include "rapidjson/writer.h" string data = "{\"Int\":1," "\"Double\":12.0000001," "\"String\":\"This is a string\"," "\"Object\":{\"name\":\"\",\"age\":25}," "\"IntArray\":[10,20,30]," "\"DoubleArray\":[1.0,2.0,3.0]," "\"StringArray\":[\"one\",\"two\",\"three\"]," "\"MixedArray\":[\"one\",50,false,12.005]," "\"People\":[{\"name\":\"\",\"age\":0,\"sex\":true}," "{\"name\":\"\",\"age\":10,\"sex\":false}," "{\"name\":\"\",\"age\":20,\"sex\":true}]}"; void parse() { //创建解析对象 rapidjson::Document doc; //首先进行解析,没有解析错误才能进行具体字段的解析 if(!doc.Parse(data.data()).HasParseError()) { //1. 解析整数 if(doc.HasMember("Int") && doc["Int"].IsInt()) { cout << "Int = " << doc["Int"].GetInt() << endl; } //2. 解析浮点型 if(doc.HasMember("Double") && doc["Double"].IsDouble()) { cout << "Double = " << doc["Double"].GetDouble() << endl; } //3. 解析字符串 if(doc.HasMember("String") && doc["String"].IsString()) { cout << "String = " << doc["String"].GetString() << endl; } //4. 解析结构体 if(doc.HasMember("Object") && doc["Object"].IsObject()) { const rapidjson::Value& object = doc["Object"]; if(object.HasMember("name") && object["name"].IsString()) { cout << "Object.name = " << object["name"].GetString() << endl; } if(object.HasMember("age") && object["age"].IsInt()) { cout << "Object.age = " << object["age"].GetInt() << endl; } } //5. 解析数组类型 //5.1 整型数组类型 if(doc.HasMember("IntArray") && doc["IntArray"].IsArray()) { //5.1.1 将字段转换成为rapidjson::Value类型 const rapidjson::Value& array = doc["IntArray"]; //5.1.2 获取数组长度 size_t len = array.Size(); //5.1.3 根据下标遍历,注意将元素转换为相应类型,即需要调用GetInt() for(size_t i = 0; i < len; i++) { cout << "IntArray[" << i << "] = " << array[i].GetInt() << endl; } } //5.2 浮点型数组类型 if(doc.HasMember("DoubleArray") && doc["DoubleArray"].IsArray()) { const rapidjson::Value& array = doc["DoubleArray"]; size_t len = array.Size(); for(size_t i = 0; i < len; i++) { //为防止类型不匹配,一般会添加类型校验 if(array[i].IsDouble()) { cout << "DoubleArray[" << i << "] = " << array[i].GetDouble() << endl; } } } //5.3 字符串数组类型 if(doc.HasMember("StringArray") && doc["StringArray"].IsArray()) { const rapidjson::Value& array = doc["StringArray"]; size_t len = array.Size(); for(size_t i = 0; i < len; i++) { //为防止类型不匹配,一般会添加类型校验 if(array[i].IsString()) { cout << "StringArray[" << i << "] = " << array[i].GetString() << endl; } } } //5.4 混合型 if(doc.HasMember("MixedArray") && doc["MixedArray"].IsArray()) { const rapidjson::Value& array = doc["MixedArray"]; size_t len = array.Size(); for(size_t i = 0; i < len; i++) { //为防止类型不匹配,一般会添加类型校验 if(array[i].IsString()) { cout << "MixedArray[" << i << "] = " << array[i].GetString() << endl; } else if(array[i].IsBool()) { cout << "MixedArray[" << i << "] = " << array[i].GetBool() << endl; } else if(array[i].IsInt()) { cout << "MixedArray[" << i << "] = " << array[i].GetInt() << endl; } else if(array[i].IsDouble()) { cout << "MixedArray[" << i << "] = " << array[i].GetDouble() << endl; } } } //5.5 结构体数组类型 if(doc.HasMember("People") && doc["People"].IsArray()) { const rapidjson::Value& array = doc["People"]; size_t len = array.Size(); for(size_t i = 0; i < len; i++) { const rapidjson::Value& object = array[i]; //为防止类型不匹配,一般会添加类型校验 if(object.IsObject()) { cout << "ObjectArray[" << i << "]: "; if(object.HasMember("name") && object["name"].IsString()) { cout << "name=" << object["name"].GetString(); } if(object.HasMember("age") && object["age"].IsInt()) { cout << ", age=" << object["age"].GetInt(); } if(object.HasMember("sex") && object["sex"].IsBool()) { cout << ", sex=" << (object["sex"].GetBool() ? "男" : "女") << endl; } } } } } / * 最后注意:因为rapidjson不会做安全校验,所以要自己做安全校验,以int整型为例 * “if(object.HasMember("age") && object["age"].IsInt()) {}” * 这句校验很重要,既要校验有该子段,也要校验类型正确,否则会引发程序崩溃 */ }

还有一种解析方法,这是用于事先不知道name的前提之下,遍历读取,如果已知name,建议使用上面,如果不知道name,则使用下面这种方式

//遍历解析 void parse_1() { // 这个是用于遍历json数组,用于不知道name的前提下 string data = "{\"name\":\"\",\"age\":20,\"sex\":true}"; rapidjson::Document dom; if(! dom.Parse(data.data()).HasParseError()) { for (rapidjson::Value::ConstMemberIterator iter = dom.MemberBegin(); iter != dom.MemberEnd(); ++iter) { string name = (iter->name).GetString(); const rapidjson::Value& value = iter->value; if(value.IsString()) { cout << name << " : " << value.GetString() << endl; } else if(value.IsInt()) { cout << name << " : " << value.GetInt() << endl; } else if(value.IsBool()) { cout << name << " : " << value.GetBool() << endl; } } } }

所有的代码都放在上面了,我想不用解释太多,代码浅显易懂,不懂的话可以回复评论。
















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

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

(0)
上一篇 2026年3月19日 下午9:43
下一篇 2026年3月19日 下午9:44


相关推荐

  • MyEclipse7.0破解下载

    MyEclipse7.0破解下载

    2021年11月16日
    68
  • java strictfp 关键字_Java 关键字 strictfp

    java strictfp 关键字_Java 关键字 strictfp1 介绍自 Java2 以来 Java 语言增加了一个关键字 strictfp 即 strictfloatp 精确浮点 strictfp 关键字可应用于类 接口或方法 使用 strictfp 关键字声明一个方法时 该方法中所有的 float 和 double 表达式都严格遵守 FP strict 的限制 符合 IEEE 754 规范 当对一个类或接口使用 strictfp 关键字时 该类中的所有代码 包括

    2025年12月7日
    6
  • 评分卡建模流程

    评分卡建模流程基于 Logistic 回归的申请评分卡模型开发基本申请评分卡建模流程 1 数据准备 收集并整合在库客户的数据 定义目标变量 排除特定样本 2 探索性数据分析 评估每个变量的值分布情况 处理异常值和缺失值 3 数据预处理 变量筛选 变量分箱 WOE 转换 样本抽样 4 模型开发 逻辑回归拟合模型 5 模型评估 常见几种评估方法 ROC KS 等 6 生成评分卡 1 数据准备因为不同评级模型所需要的数据也是不

    2026年3月17日
    3
  • PHP在线客服系统平台源码(完全开源的网页在线客服系统)

    PHP在线客服系统平台源码(完全开源的网页在线客服系统)  在线客服系统是一个使用PHP、JavaScript和CSS开发的即时网页聊天咨询系统。该项目包含管理员和用户端。管理员端管理所有的管理,如编辑站点内容、管理提供者和预订,管理员在这个系统的管理中起着重要的作用。    在线客服系统源码及演示:zxkfym.top    对于用户部分,用户可以浏览主页、关于和服务。用户可以是顾客谁需要家庭服务或服务提供商提供家庭服务的人。为了注册为服务提供商,用户必须填写注册表格。然而,要将服务提供商作为客户预订,用户可以先搜索可用的服务提供商,然后再进行预订。该

    2022年7月19日
    72
  • AES-CMAC代码实现

    AES-CMAC代码实现AES CMAC 代码的 C 实现本人使用的 codeblock 来编写代码 以及代码的仿真和调试的 感觉挺好用 代码实现主要分为三部分 start mid end 类似 CRC 校验的实现方式 加密算法 plaintext 明文 ciphertext 密文 key 秘钥 voidEncryPti uint8 tplaintext 16 uint8 tkey 16 uint8 tciphertext 16 inti j uint8 tstate 4 4 for

    2026年1月24日
    8
  • 行存储和列存储的优缺点

    行存储和列存储的优缺点按行存储:数据按行存储在底层文件系统中,通常,每一行会被分配固定的空间优点:有利于增加、修改整行记录等操作,有利于整行数据的读取操作缺点:单列查询时,会读取一些不必要的数据按列存储:数据以列为单位,存储在底层文件系统中优点:有利于面向单列数据的读取/统计等操作缺点:整行读取时,可能需要多次I/O操作…

    2022年7月14日
    30

发表回复

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

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