文章目录

  • Rapidjson的简单使用
    • 一、rapidjson的构造
      • 1.1 Addmember构造
      • 1.2 用writer构造
    • 二、rapidjson查询
      • 2.1 获取整个json字符串
      • 2.2 查询Value
      • 2.2 查询Array
      • 2.3 查询object
      • 2.4 查询Number
      • 2.5 查询String
    • 三、rapidjson修改
      • 3.1 改变value值
      • 3.2 修改String
      • 3.3 修改Array
      • 3.4 修改Object
      • 3.5 深拷贝
      • 3.6 交换值
      • 3.7 遍历json内容

Rapidjson的简单使用

一、rapidjson的构造

1.1 Addmember构造

    rapidjson::Document document;document.SetObject();// 添加name, valueconst char* name = "success_url";const char* value = "https://www.google.com";document.AddMember(rapidjson::StringRef(name), rapidjson::StringRef(value), document.GetAllocator());// 添加json objectrapidjson::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 arrayrapidjson::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());

1.2 用writer构造

    rapidjson::StringBuffer s;rapidjson::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();std::cout << s.GetString() << std::endl;

二、rapidjson查询

2.1 获取整个json字符串

    std::string json = std::string(buffer.GetString());

2.2 查询Value

假设现有一个json文件。

const char* json  = {"hello": "world","t": true ,"f": false,"n": null,"i": 123,"pi": 3.1416,"a": [1, 2, 3, 4]
}
  • 解析为一个document
#include "rapidjson/document.h"
using namespace rapidjson;Document document;
document.Parse(json);
  • 判断是否是一个object:document.IsObject()
  • 判断是否有成员hello:document.HasMember(“hello”)
  • 判断是否是字符串:document[“hello”].IsString()
  • 获取字符串:document[“hello”].GetString()
  • 判断是否是bool类型:document[“t”].IsBool()
  • 获取bool值:document[“t”].GetBool()
  • 判断是否为null:document[“n”].IsNull()
  • document[“i”].IsNumber()
  • document[“i”].IsInt()
  • document[“i”].GetInt()
  • document[“pi”].IsDouble()
  • document[“pi”].GetDouble()

2.2 查询Array

  • 方式一:
const Value& a = document["a"];
assert(a.IsArray());
for (SizeType i = 0; i < a.Size(); i++) // 使用 SizeType 而不是 size_tprintf("a[%d] = %d\n", i, a[i].GetInt());
  • 方式二:
for (Value::ConstValueIterator itr = a.Begin(); itr != a.End(); ++itr)printf("%d ", itr->GetInt());
  • 方式三:
for (auto& v : a.GetArray())printf("%d ", v.GetInt());

2.3 查询object

  • 方式一:
static const char* kTypeNames[] = { "Null", "False", "True", "Object", "Array", "String", "Number" };
for (Value::ConstMemberIterator itr = document.MemberBegin();itr != document.MemberEnd(); ++itr)
{printf("Type of member %s is %s\n",itr->name.GetString(), kTypeNames[itr->value.GetType()]);
}
  • 方式二:
Value::ConstMemberIterator itr = document.FindMember("hello");
if (itr != document.MemberEnd())printf("%s\n", itr->value.GetString());
  • 方式三:
for (auto& m : document.GetObject())printf("Type of member %s is %s\n",m.name.GetString(), kTypeNames[m.value.GetType()]);

2.4 查询Number

查询 获取
bool IsNumber() 不适用
bool IsUint() unsigned GetUint()
bool IsInt() int GetInt()
bool IsUint64() uint64_t GetUint64()
bool IsInt64() int64_t GetInt64()
bool IsDouble() double GetDouble()

2.5 查询String

  • GetString() 获取字符串
  • GetStringLength() 获取字符串长度

三、rapidjson修改

3.1 改变value值

  • 方式一:
    采用SetXXX或赋值操作实现
Document d; // Null
d.SetObject();Value v;    // Null
v.SetInt(10);
v = 10;     // 简写,和上面的相同

方式二:

Value b(true);    // 调用 Value(bool)
Value i(-123);    // 调用 Value(int)
Value u(123u);    // 调用 Value(unsigned)
Value d(1.5);     // 调用 Value(double)Value o(kObjectType);      //object
Value a(kArrayType);       //array

3.2 修改String

Value s;
s.SetString("rapidjson");    // 可包含空字符,长度在编译期推导
s = "rapidjson";             // 上行的缩写

3.3 修改Array

包含接口:

  • Clear()
  • Reserve(SizeType, Allocator&)
  • Value& PushBack(Value&, Allocator&)
  • template GenericValue& PushBack(T, Allocator&)
  • Value& PopBack()
  • ValueIterator Erase(ConstValueIterator pos)
  • ValueIterator Erase(ConstValueIterator first, ConstValueIterator last)
Value a(kArrayType);
Document::AllocatorType& allocator = document.GetAllocator();for (int i = 5; i <= 10; i++)a.PushBack(i, allocator);   // 可能需要调用 realloc() 所以需要 allocator// 流畅接口(Fluent interface)
a.PushBack("Lua", allocator).PushBack("Mio", allocator);

3.4 修改Object

Object 是键值对的集合。每个键必须为 String。要修改 Object,方法是增加或移除成员。以下的 API 用来增加成员:

  • Value& AddMember(Value&, Value&, Allocator& allocator)
  • Value& AddMember(StringRefType, Value&, Allocator&)
  • template Value& AddMember(StringRefType, T value, Allocator&)
  • bool RemoveMember(const Ch* name):使用键名来移除成员(线性时间复杂度)。
  • bool RemoveMember(const Value& name):除了 name 是一个 Value,和上一行相同。
  • MemberIterator RemoveMember(MemberIterator):使用迭代器移除成员(_ 常数 _ 时间复杂度)。
  • MemberIterator EraseMember(MemberIterator):和上行相似但维持成员次序(线性时间复杂度)。
  • MemberIterator EraseMember(MemberIterator first, MemberIterator last):移除一个范围内的成员,维持次序(线性时间复杂度)。
Value contact(kObject);
contact.AddMember("name", "Milo", document.GetAllocator());
contact.AddMember("married", true, document.GetAllocator());

3.5 深拷贝

CopyFrom()

3.6 交换值

Swap()

Value a(123);
Value b("Hello");
a.Swap(b);

3.7 遍历json内容

#include<iostream>
#include"rapidjson/document.h"
#include"rapidjson/writer.h"
#include"rapidjson/stringbuffer.h"
#include<string>using namespace rapidjson;
using namespace std;int main(){string strJsonTest = "{\"item_1\":\"value_1\",\"item_2\":\"value_2\",\"item_3\":\"value_3\",\"item_4\":\"value_4\",\"item_arr\":[\"arr_vaule_1\",\"arr_vaule_2\"]}";Document docTest;docTest.Parse<0>(strJsonTest.c_str());if (!docTest.HasParseError()){for (rapidjson::Value::ConstMemberIterator itr = docTest.MemberBegin(); itr != docTest.MemberEnd(); itr++){Value jKey;Value jValue;Document::AllocatorType allocator;jKey.CopyFrom(itr->name, allocator);jValue.CopyFrom(itr->value, allocator);if (jKey.IsString()){string name = jKey.GetString();printf("\r\nname: %s\r\n", name.c_str());}if (jValue.IsString()){std::cout << "jValue" << jValue.GetString() << std::endl;}}}return 0;}

Rapidjson的简单使用相关推荐

  1. Rapidjson的简单使用(拼接json串,存取文件中的json,解析json串)

    Rapidjson的简单使用示例 很早就想用用Markdown了,一直没机会.今天就来试一下 先放个目录: Rapidjson的简单使用示例 rapidjson官方教程 本示例所用环境 示例代码与注释 ...

  2. hiredis和rapidjson库的使用小结

    Hiredis 简介 Hiredis 是Redis官方发布的C版本客户端 hiredis库.redis的源码中也有使用hiredis.比如redis-cli和Redis中的哨兵机制和主从机制,集群等都 ...

  3. rapidjson官方教程

    原文地址:http://rapidjson.org/zh-cn/md_doc_tutorial_8zh-cn.html 教程 目录 Value 及 Document 查询Value 查询Array 查 ...

  4. jsoncpp和rapidjson哪个好用?

    作者:Milo Yip 链接:http://www.zhihu.com/question/23654513/answer/46157616 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非 ...

  5. rapidjson!完美的C++解析json库

    感谢开源! git上有很多解析json的库文件,比如常见的JsonCpp.cJSON等,这些都能满足正常使用.但一旦有了速度.轻量化.简便的追求,就不得不比较一下各个库的优劣了. 荡某乎上的一张各种比 ...

  6. RapidJSON 代码剖析(三):Unicode 的编码与解码

    根据 RFC-7159: 8.1 Character Encoding JSON text SHALL be encoded in UTF-8, UTF-16, or UTF-32. The defa ...

  7. RapidJSON v1.1.0 发布简介

    时隔 15.6 个月,终于发布了一个新版本 v1.1.0. 新版本除了包含了这些日子收集到的无数的小改进及 bug fixes,也有一些新功能.本文尝试从使用者的角度,简单介绍一下这些功能和沿由. P ...

  8. C++ rapidjson 基础入门

    此篇文章中对于rapidjson的使用方法基本上来源于 rapidjson中文使用手册 rapidjson的基本介绍.使用好处.解析速度等不在此篇讲述,因为在官网上已经讲得非常详细了,这里写的都是本人 ...

  9. RapidJSON入门:手把手教入门实例介绍

    RapidJSON优点 跨平台 编译器:Visual Studio.gcc.clang 等 架构:x86.x64.ARM 等 操作系统:Windows.Mac OS X.Linux.iOS.Andro ...

最新文章

  1. 如何使用jQuery向asp.net Mvc传递复杂json数据
  2. stm32f4 hs 电路_三相电路分析
  3. SAP UI5 初学者教程之二十六 - OData 服务配合 Mock 服务器的使用步骤详解试读版
  4. oracle移动表所在的表空间,ORACLE移动表空间(原)
  5. 内置的常用协议实现模版
  6. 2020-11-08
  7. 【收藏】请不要做浮躁的人
  8. wincc 如何实现上下箭头对数字的增减_由箭头函数引发的对一些概念的认识
  9. linux下proc里关于磁盘性能的参数
  10. 数据分析与挖掘中常用Python库的介绍与实践案例
  11. qt 语言设置乱码_QT中文乱码与国际化支持
  12. ESP8266|ESP8266入门教程-AT指令视频教程(基于ESP-01S/ESP8266-01S)
  13. VUE中switch使用
  14. java表白代码,神操作!
  15. 管理信息系统(MIS)权威期刊列表
  16. 倾斜摄影静态单体化 BIM模型调用解决思路
  17. 各种字符串Hash函数比较
  18. 实现两个主机之间的密钥分发和安全传输
  19. textarea内容换行,textarea中换行符br失效
  20. 像素和分辨率的关系 完全剖析

热门文章

  1. Docker再曝安全漏洞,这次是PWD的问题
  2. dpdk-20.11 学习篇 编译和安装
  3. 如何让地面不起灰_怎么拖地板最干净,让地板半年不沾灰尘的小妙招
  4. element ui 表格动态列显示空白bug 修复
  5. u-boot-2014.10移植第29天----nand flash的SPL启动(一)
  6. vue3-seamless-scroll无缝滚动组件
  7. pc端、移动端插入背景音乐,自动播放,循环播放
  8. linux 查看oracle数据库字符集,Oracle字符集的查看查询和Oracle字符集的设置修改
  9. android解决 Button 和 TabLayout 英文自动大写的问题
  10. Visual Studio安装,更新,报错,密钥