rapidjson使用

RapidJSON入门:手把手教入门实例介绍 RapidJSON优点 跨平台 编译器:Visual Studio、gcc、clang 等 架构:x86、x64、ARM 等 操作系统:Windows、Mac OS X、Linux、iOS、Android 等 容易安装 只有头文件的库。只需把头文件复制至你的项目中。 独立、最小依赖 不需依赖 STL、BOOST 等。 只包含 <cstdio>, <cstdlib>, <cstring>, <inttypes.h>, <new>, &. 阅读详情

简介

Rapidjson is a fast JSON parser/generator for C++ with both SAX/DOM style API.
其所有源代码都包含在源码包的include/rapidjson/include目录下,使用时只需要include相应的头文件即可。
详细的介绍见rapid官方文档

使用rapidjson解析json串

先看下rapidjson中的value有哪些类型, rapidjson中定义的类型的先后顺序为:
“Null”, “False”, “True”, “Object”, “Array”, “String”, “Number”
其中Number类型包含int, uint, int64, uint64, double

Type GetType()  const { return static_cast<Type>(data_.f.flags & kTypeMask); }    
bool IsNull()   const { return data_.f.flags == kNullFlag; }
bool IsFalse()  const { return data_.f.flags == kFalseFlag; }
bool IsTrue()   const { return data_.f.flags == kTrueFlag; }
bool IsBool()   const { return (data_.f.flags & kBoolFlag) != 0; }
bool IsObject() const { return data_.f.flags == kObjectFlag; }
bool IsArray()  const { return data_.f.flags == kArrayFlag; }
bool IsNumber() const { return (data_.f.flags & kNumberFlag) != 0; }
bool IsInt()    const { return (data_.f.flags & kIntFlag) != 0; }
bool IsUint()   const { return (data_.f.flags & kUintFlag) != 0; }
bool IsInt64()  const { return (data_.f.flags & kInt64Flag) != 0; }
bool IsUint64() const { return (data_.f.flags & kUint64Flag) != 0; }
bool IsDouble() const { return (data_.f.flags & kDoubleFlag) != 0; }
bool IsString() const { return (data_.f.flags & kStringFlag) != 0; }

有了这个后,我们就可以根据dom节点的类型来解析出对应的value,伪代码如下如下:

#define ERROR -1
#define OK 0

string jsonstr = {"key":value, ...};
Document document;
if(document.Parse(jsonstr.c_str()).HasParseError())
{
	return ERROR;
}

const rapidjson::Value& value = document["key"]; //use [] operator to get node value
/** use FindMember function 
auto var = document.FindMember("key");
if(var != document.MemberEnd())
{
	rapidjson::Value& value = var->value;
}
*/
if(value.IsNull())
{
	...
}
else if(value.IsObject())
{
	//continue to parse 
	...
}else if(value.isString())
{
	cout << value.GetString();
}else if(value.isNumber())
{
	if(value.isInt())
	{...
	}else if(value.isUint())
	{...
	}else ...
	
}
...

另外,我们也可以实现一个打印json串内容的函数:

int printJsonString(string& jsonstr)
{
	Document document;
	if(document.Parse(json).HasParseError())
	{
		return -1;
	}
	static const char* kTypeNames[] = 
		{ "Null", "False", "True", "Object", "Array", "String", "Number" };
	for (auto& m : document.GetObject())
	{
		printf("Type of member %s is %s\n",
		m.name.GetString(), kTypeNames[m.value.GetType()]);
		if(m.value.isNull())
		{
			printf("key = %s, value = %s\n", m.name.GetString(), "null");
		}else if(m.value.isString())
		{	
			printf("key = %s, value = %s\n", m.name.GetString(), m.value.GetString());
		}else if(...)
		...
		
	}
	return 0;
}

上述解析的json串是通过string or char字符串输入的,如果json串来源于文件的话,就需要使用如下的方法调用Parse方法(详细使用说明参考rapidjson文件流):

#include "rapidjson/filereadstream.h"
#include <cstdio>
using namespace rapidjson;
FILE* fp = fopen("big.json", "rb"); // 非 Windows 平台使用 "r"
char readBuffer[65536];
FileReadStream is(fp, readBuffer, sizeof(readBuffer));
Document d;
d.ParseStream(is);
fclose(fp);

使用rapidjson构造json串

有几种方法可用于构造json串:

  1. 通过rapidjson::Writer<rapidjson::StringBuffer>对象的’StartObject/EndObject’ Method.
int constructJsonStr1(string& outputStr) 
{ 
    rapidjson::StringBuffer json_str_buf; 
    rapidjson::Writer<rapidjson::StringBuffer> json_writer(json_str_buf); 
    json_writer.StartObject(); 
    json_writer.String("id"); 
    json_writer.Uint(0); 
    json_writer.String("name"); 
    json_writer.String("zhangsan"); 
 
    json_writer.String("data"); 
    json_writer.StartObject(); 
    json_writer.String("age"); 
    json_writer.Uint(20); 
    json_writer.String("province"); 
    json_writer.String("guangdong"); 
    json_writer.EndObject(); 
 
    json_writer.EndObject(); 
 
 	 outputStr = json_str_buf.GetString(); 
    cout << outputStr << endl; 
    return 0; 
} 

  1. 通过构造一个rapidjson::Document对象,使用rapidjson::Document及rapidjson::Value的’AddMember’ Method.
int constructJsonStr2()
{
    rapidjson::Document document;
    document.SetObject();
    rapidjson::Document::AllocatorType & allocator = document.GetAllocator();

    document.AddMember("id", 0, allocator);
    document.AddMember("name", rapidjson::StringRef("zhangsan"), allocator);

    rapidjson::Value data_obj(rapidjson::kObjectType);
    data_obj.AddMember("age", 20, allocator);
    data_obj.AddMember("province", rapidjson::StringRef("guangdong"), allocator);

    document.AddMember("data", data_obj, allocator);

    rapidjson::StringBuffer buffer;
    rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
    document.Accept(writer);

    cout << buffer.GetString() << endl;
    return 0;
}
  1. 使用Document + Pointer
Document d;
// 使用 Set() 创建 DOM
Pointer("/project").Set(d, "RapidJSON");
Pointer("/stars").Set(d, 10);
// { "project" : "RapidJSON", "stars" : 10 }

p.s.:

  • PushBack及AddMember中使用了转移语义
  • copy-string与const-string
    当我们把一个 copy-string 赋值时, 调用含有 allocator 的 SetString() 重载函数.
Document document;
Value author;
char buffer[10];
int len = sprintf(buffer, "%s %s", "Milo", "Yip"); // 动态创建的字符串。
author.SetString(buffer, len, document.GetAllocator());
memset(buffer, 0, sizeof(buffer));
// 清空 buffer 后 author.GetString() 仍然包含 "Milo Yip"

对于字符串字面量或有安全生命周期的字符串,可以使用 const-string 版本的 SetString(),它没有 allocator 参数。对于字符串字面量(或字符数组常量),只需简单地传递字面量,又安全又高效:

Value s;
s.SetString("rapidjson");    // 可包含空字符,长度在编译萁推导
s = "rapidjson";  

对于字符指针,RapidJSON 需要作一个标记,代表它不复制也是安全的。可以使用 StringRef 函数

C++ RapidJSON使用详解 RapidJSON主页:RapidJSON 是由腾讯开发的一个 C++ 的 JSON 解析器及生成器,它的灵感来自 RapidXml。 阅读详情

相关推荐

【C++】开源:rapidjson数据解析库配置与使用

rapidjson数据解析库配置使用

DevFrank的博客 1392

RapidJSON简介及使用

RapidJSON是腾讯开源的一个高效的C++ JSON解析器及生成器,它是只有头文件的C++库

网络资源是无限的 8万+

【论文阅读笔记】One Shot 3D Photography

论文主页:https://facebookresearch.github.io/one_shot_3d_photography/ 代码地址:https://github.com/facebookresearch/one_shot_3d_photography   该3D照片方向,由于刚入门,所以会倾向于翻译文章。每个操作上的选择,及为什么不进行另外操作的原因都如数放上。 论文小结   本作的工作是从单张RGB图片生成一个移动视角的3D照片。   其管道大致如下: 由RGB图像通过单目深度估计网络估计深度图

时光机 °的博客 1839

RapidJSON介绍

RapidJSON 是一个 C++ 的 JSON 解析库,由腾讯开源。支持 SAX 和 DOM 风格的 API,并且可以解析、生成和查询 JSON 数据。RapidJSON 快。它的性能可与strlen() 相比。可支持 SSE2/SSE4.2 加速。RapidJSON 独立。它不依赖于 BOOST 等外部库。它甚至不依赖于STL。RapidJSON 对内存友好。在大部分 32/64 位机器上,每个 JSON 值只占 16字节(除字符串外)。

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 3362

云架构师进阶【SAP迁移方案设计】手把手教您玩转SAP上云

一,项目背景介绍 今天又接到了北京某制造企业SAP迁移的场景,先简单说明一下,好好的SAP在运行着为什么要做迁移这类大动作呢?众所周知SAP的ERP是企业的绝对核心系统,尤其对于制造业更是核心的系统,这样一套核心系统还是生产环境在迁移的过程中必然要面临比较大的挑战,如果有任何问题的话,都会对企业的绩效产生很大的影响。 经过跟客户沟通才得知,客户的SAP原来的系统是托管在运营商机房里,近期感染了勒索病毒,导致业务宕机,SAP应用服务器无法启动,仅有的数据库服务器可以运行。基于上述情况公司领导当机立断决定迅

bdsh818的博客 4220

别再浪费HDRI了!D5渲染器环境光设置避坑指南(附天空球调试参数)

本文深入解析D5渲染器中HDRI环境光的高阶调试技巧,揭示90%渲染师常犯的错误认知。通过参数联动黄金法则、特殊材质应对方案及动态场景优化策略,帮助用户精准控制光子能量分布,实现建筑玻璃反射云层过渡等专业级效果。附赠天空球调试参数和商业项目验证案例,助您彻底释放HDRI潜力。

weixin_29216049的博客 495

RapidJSON的使用

关于RapidJSON rapidjson项目地址:https://github.com/miloyip/rapidjson 项目下载完成后,打开readme.md文件,查看项目说明。 RapidJSON is a header-only C++ library. Just copy the `include/rapidjson` folder to system or project's include path. RapidJSON是一个只有头文件的C++ JSON库,只需要拷贝“include/

1万+

Innovus Flexible H-tree and Multi-tap Clock Flow Lab实操系列教程(Day1)

Innovus Flexible H-tree and Multi-tap Clock Flow Lab实操系列教程(Day1)

weixin_37584728的博客 2637

rapidjson使用简介

简介 在c++中用来解析Json的库很多,如Jsoncpp。 我之前也使用Jsoncpp来做Json解析,但自从接触rapidjson后,特别是尝试使用之后,便决定以后就使用它了,要与Jsoncpp说拜拜。 使用Jsoncpp的同学不妨尝试一下,不管在易用性还是性能方面,rapidjson都是可圈可点的。 RapidJSON 是一个 C++ 的 JSON 解析器及生成器。它的灵感来自 Rapid...

guotianqing的博客 3139

【算法】—前缀和与差分详解

前缀和指一个数组的某下标之前的所有数组元素的和(即数列的前n项求和),前缀和是一种重要的预处理,能够降低算法的时间复杂度,可以快速地求出某一段的和,对于处理区间之间的问题是往往十分高效相比较其他算法而言,前缀和更像是一种解题的技巧,一种优化方式输入一个长度为 n 的整数序列。接下来再输入 m 个询问,每个询问输入一对 l,r 对于每个询问,输出原序列中从第 l 个数到第 r 个数的和5 32 1 3 6 41 21 32 4123453610。

DAY I 的成长之路 6022

QMT实盘避坑指南:从环境配置到策略部署的完整流程(含国金证券路径设置)

本文是一份详尽的QMT实盘交易避坑指南,重点解析了从环境配置到策略部署的完整流程。针对国金证券QMT平台,文章深入剖析了核心架构、精准路径配置、关键参数解析、交易操作实战及异常处理,并提供了策略部署、监控与日志构建的完整方案,旨在帮助具备Python基础的开发者规避常见陷阱,实现稳定可靠的实盘交易。

weixin_29309475的博客 590

RapidJSON

要在项目中使用 RapidJSON 库,需要首先下载并包含该库的头文件。

不才的专栏 1088

杰理JL703N的SDK内部MIDI 音色库功能使用教程

本文介绍了MIDI琴按键解码和MIDI文件解码的实现方法。MIDI琴解码通过audio_dec_midi_ctrl.c文件实现,MIDI文件(mfa格式)解码则使用audio_dec_midi_file.c。使用前需将音色文件存放在SD卡或内置flash中(需确保四字节对齐),并在download.c中配置路径。同时需在板级配置中将FLASH设置为16Mbit以解决编译问题。关键注意事项包括音色文件的文件夹结构对齐要求和MIDI数据流的正确配置。

qq_42014563的博客 390

c++ rapidjson使用总结

RapidJSON是腾讯开源的一个高效的C++ JSON解析器及生成器,它是只有头文件的C++库。RapidJSON是跨平台的,支持Windows, Linux, Mac OS X及iOS, Android。它的源码在https://github.com/Tencent/rapidjson/,稳定版本为2016年发布的1.1.0版本。官方教程:http://rapidjson.org/zh-cn/md_doc_tutorial_8zh-cn.html RapidJSON特点: (1). RapidJSO

sinat_33419023的博客 926

使用静态库在嵌入式系统中进行开发

静态库是一种包含预编译对象代码的文件,它可以与应用程序链接在一起,并在编译时将库的代码复制到最终的可执行文件中。静态库是包含预编译对象代码的文件,可以与应用程序链接在一起,并在编译时将库的代码复制到最终的可执行文件中。需要注意的是,由于嵌入式系统的资源限制,开发人员应该仔细选择需要包含在静态库中的功能,并避免引入不必要的依赖关系。需要注意的是,由于嵌入式系统的资源限制,开发人员应该仔细选择需要包含在静态库中的功能,并避免引入不必要的依赖关系。的静态库文件,可以在嵌入式系统的应用程序中使用它了。

ZrElixir的博客 203

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

rapidjson

文章目录rapidjson库在windows,linux中下载,安装,示例简介参考链接 rapidjson库在windows,linux中下载,安装,示例 Value的新建及key的访问,修改 从字符串中解析json 从文件中读取解析json 把json写入到文件 简介 C++ 的 JSON 解析器及生成器。它的灵感来自 RapidXml。   小而全。同时支持 SAX 和 DOM 风格的 API。 SAX 解析器只有约 500 行代码。 RapidJSON 快。性能可与 strlen(

fgh123的博客 882

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

RapidJson的使用

rapidJson的使用 写Json:创建一个简单的json结构 方式一:使用rapidjson #define JSON_KEY_NAME_CONTENT "body" #define JSON_KEY_NAME_DATATYPE "type" #define JSON_KEY_REPORT_NAME_ACTIONRESULT "ActionRes" #define JSON_DATA_...

sinat_38602176的博客 1106

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C++ JSON 解析——RapidJSON介绍

RapidJSON 是腾讯的开源 json 解析框架

看艾薇的熊猫的博客 2783

rapidjson库的基本使用

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

qq849635649的博客 1万+

rapidjson图文讲解

目录 简介 注意事项 GenericValue json数据加载和输出 API 本文记录rapidjson的使用心得,篇幅较小,主要总结其中的重点部分,以文字和图表的方式叙述。 简介 RapidJSON 是一个C++的JSON 解析器及生成器。我个人比较推荐,理由可看官网http://rapidjson.org/zh-cn/index.html介绍。而jsoncpp并不推荐...

kongds的博客 2835

rapidjson的下载以及简单使用

redisjson的下载以及使用一、redisjson的下载二、redisjson的使用1.windows平台下二、使用步骤1.引入库2.读入数据总结 一、redisjson的下载 下载地址:https://github.com/Tencent/rapidjson 二、redisjson的使用 1.windows平台下 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotlib.pyplot as plt i

qq_46380537的博客 2587

rapidjson实战

rapidjson实战前言一、应用序列化步骤解析步骤实战注意事项 前言 RapidJSON 是一个小、快、独立的 C++ 的 JSON 解析器及生成器,仅由头文件组成。具备如下特点: RapidJSON 小而全。它同时支持 SAX 和 DOM 风格的 API。SAX 解析器只有约 500 行代码。 RapidJSON 快。它的性能可与 strlen() 相比。可支持 SSE2/SSE4.2 加速。 RapidJSON 独立。它不依赖于 BOOST 等外部库。它甚至不依赖于 STL。 RapidJSON

weixin_37840904的博客 595

C++ rapidjson 基础入门

此篇文章中对于rapidjson的使用方法基本上来源于rapidjson中文使用手册rapidjson的基本介绍、使用好处、解析速度等不在此篇讲述,因为在官网上已经讲得非常详细了,这里写的都是本人拙劣的见解,如有不足之处,烦请各位指出。本文结构:1、基本单元;2、构建3、增4、删5、查6、改7、输出8、拷贝9、总结1、基本单元rapidjson的基本操作单元:Document以及Value例:当有...

众秒之门 3万+

rapidjson常见使用示例

目录 目录 1 1. 前言 2 2. Move语意 2 3. rapidjson::Document 2 4. 内存泄漏 3 5. 成员迭代器MemberIterator 4 6. 数组迭代器ValueIterator 4 7. #include头文件 5 8. 示例1:解析一个字符串 5 9. 示例2:构造一个json并转成字符串 7 10. 示例3:修改一个已有的json...

一见 1万+
上一篇: SO_RESUSEPORT和SO_REUSEADDR的区别
下一篇: jsoncpp使用
LinuxG_G
博客等级 码龄15年 58粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值