RapidJson简介

2人阅读 评论(0) 收藏 举报
分类:
RapidJSON是一个C++的高性能的JSON解析器及生成器,同时支持SAX/DOM风格的API。

简介

  • RapidJSON是一个C++的JSON解析器及生成器。它的灵感来自RapidXml
  • RapidJSON小而全。它同时支持SAX和DOM风格的API。SAX解析器只有约500行代码
  • RapidJSON快。它的性能可与strlen()相比。可支持SSE2/SSE4.1加速
  • RapidJSON独立。它不依赖于BOOST等外部库。它甚至不依赖于STL
  • RapidJSON对内存友好。在大部分32/64位机器上,每个JSON值只占16或20字节(除字符串外)。它预设使用一个快速的内存分配器,令分析器可以紧凑地分配内存
  • RapidJSON对Unicode友好。它支持UTF-8、UTF-16、UTF-32 (大端序/小端序),并内部支持这些编码的检测、校验及转码。例如,RapidJSON可以在分析一个UTF-8文件至DOM时,把当中的JSON字符串转码至UTF-16。它也支持代理对(surrogate pair)及"\\u0000"(空字符)

Rapdijson解析

Json本身是JavaScript对象表示法(JavaScript Ojbect Notation),在javascript层面很容易解析。对于c++,必须导入相关库文件。在json解析之前,要先了解json几个相关概念:
Value:value其实就是var,对于value可以理解为int,也是理解为string,或者是bool型变量等其他数据类型。对于定义Value value,只是一个定义,还没有决定其数据类型,如果明确value的值,则相应确定其数据类型了。Json数据类型是一个map,表示为key-value形式,对于Value转换为基础数据类型有一下几种方法:vall.SetArray();vall.SetArrayRaw();vall.SetBool();vall.SetDouble();vall.SetInt();vall.SetNull();vall.SetObject();vall.SetString();vall.SetStringRaw() vall.SetUint();同时,对于value的数据类型,是可以重复设置。
Write:将Value数据编码成json合适数据格式;

Reader:与Writer相反,是将json格式数据解析成一个Value值。

实例

/*
下载rapidjson-master.zip,解压后,把include文件夹拷贝到自己的工程中就可以使用了
只需要include,不需要加载.lib,.dll
*/

// rapidjson/example/simpledom/simpledom.cpp`
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <iostream>
using namespace rapidjson;
int main() {
	// 1. 把 JSON 解析至 DOM。
	const char* json = "{\"project\":\"rapidjson\",\"stars\":10}";
	Document d;///< 创建一个Document对象 rapidJson的相关操作都在Document类中
	d.Parse(json);///< 通过Parse方法将Json数据解析出来
	
	if (!d.HasParseError())
	{
		//这里要注意一点就是一定要对解析出来的document(JSON解析出来以xml dom形式存在)进行判断,判断是否解析正确,否则后面一切处理均是无效的。

		// 2. 利用 DOM 作出修改。
		Value& s = d["stars"];
		/*
		Value:value其实就是var,对于value可以理解为int,也是理解为string,或者是bool型变量等其他数据类型。对于定义Value value,只是一个定义,还没有决定其数据类型,如果明确value的值,则相应确定其数据类型了。
		Json数据类型是一个map,表示为key-value形式,对于Value转换为基础数据类型有
		一下几种方法:
		  vall.SetArray()	vall.SetArrayRaw()	vall.SetBool()	vall.SetDouble()		vall.SetInt()
		  vall.SetNull()	vall.SetObject()		vall.SetString()	vall.SetStringRaw()	vall.SetUint();
		  同时,对于value的数据类型,是可以重复设置。
		*/

		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;
	}

	return 0;
}
执行过程示意图:


每个 JSON 值都储存为 Value 类,而 Document 类则表示整个 DOM,它存储了一个 DOM 树的根 Value。RapidJSON 的所有公开类型及函数都在 rapidjson 命名空间中。

根据Json语法规则,花括号保存对象,中括号保存数组;所以Document就是对象。

[概念]JSON

RapidJSON 文档教程

Git--RapidJSON

DOM是什么

DOM(文档对象模型)是针对HTML和XML文档的一个API,是JavaScript操作网页的接口,通过DOM可以去改变文档。它的作用是将网页转为一个javascript对象,从而可以使用javascript对网页进行各种操作(比如增删内容)。浏览器会根据DOM模型,将HTML文档解析成一系列的节点,再由这些节点组成一个树状结构。DOM的最小组成单位叫做节点(node),文档的树形结构(DOM树)由12种类型的节点组成。简而言之,DOM可以理解为一个访问或操作HTML各种标签的实现标准。
一般地,节点至少拥有nodeType、nodeName和nodeValue这三个基本属性。节点类型不同,这三个属性的值也不相同。
nodeType:nodeType属性返回节点类型的常数值。不同的类型对应不同的常数值,12种类型分别对应1到12的常数值

  • 元素节点              Node.ELEMENT_NODE(1)
  • 属性节点              Node.ATTRIBUTE_NODE(2)
  • 文本节点              Node.TEXT_NODE(3)
  • CDATA节点             Node.CDATA_SECTION_NODE(4)
  • 实体引用名称节点       Node.ENTRY_REFERENCE_NODE(5)
  • 实体名称节点          Node.ENTITY_NODE(6)
  • 处理指令节点          Node.PROCESSING_INSTRUCTION_NODE(7)
  • 注释节点              Node.COMMENT_NODE(8)
  • 文档节点              Node.DOCUMENT_NODE(9)
  • 文档类型节点          Node.DOCUMENT_TYPE_NODE(10)
  • 文档片段节点          Node.DOCUMENT_FRAGMENT_NODE(11)
  • DTD声明节点            Node.NOTATION_NODE(12)
nodeName:nodeName属性返回节点的名称
nodeValue:nodeValue属性返回或设置当前节点的值,格式为字符串
查看评论

rapidjson操作指南

本文将介绍如何用rapidjson的DOM方式进行json的常见操作: 一、
  • lihuapinghust
  • lihuapinghust
  • 2014-05-07 18:51:10
  • 1854

rapidjson库的基本使用

我在工作中一直使用的是rapidjson库,这是我在工作中使用该库作的一些整理,以读写下面的这段json字符串为例来进行整理,该字符串覆盖了平时使用的布尔类型、整型、浮点类型、结构体类型、字符串类型以...
  • qq849635649
  • qq849635649
  • 2016-09-27 10:54:02
  • 988

如何使用rapidjson库进行json格式的封装及解析

一,字符串json封装及及解析的实例 #include "rapidjson/document.h" #include "rapidjson/prettywriter.h"   #inclu...
  • wangqing_12345
  • wangqing_12345
  • 2016-08-29 15:34:40
  • 9349

rapidjson的使用例子

最近在使用json, 由以前的jsoncpp转为rapidjson, 听说这个效率高一点; 不过我觉得比较好的就是rapidjson不需要库,只要头文件就可以了 记录下来方便自己以后使用 #incl...
  • SunboyJohn690905084
  • SunboyJohn690905084
  • 2016-11-28 16:50:50
  • 2542

rapidjson初探——使用C++解析json

刚开始想用jsoncpp的,发现这东西相当不友好,VS2013就是编译不了,于是就弃坑了 发现rapidjson超级好用,只需要包含头文件,也就是可以跨平台 虽然写很复杂的功能的时候可能需要自己封...
  • SteelBasalt
  • SteelBasalt
  • 2016-05-01 15:43:33
  • 8539

rapidjson 添加删除对象

rapidjson我就不介绍了,以后有机会在补上。 直接上代码#include "rapidjson/document.h" #include "rapidjson/stringbuffer.h" #...
  • u012592081
  • u012592081
  • 2016-06-30 14:49:11
  • 3642

RapidJSON简介

RapidJSON是腾讯公司开源的一个C++的高性能的JSON解析器及生成器,同时支持SAX/DOM风格的API。 项目源码地址: Github托管:https://githu...
  • liujiayu2
  • liujiayu2
  • 2016-05-19 14:53:38
  • 632

rapidjson使用编译报错问题解决

在调用AddMember把std::string类型值直接作为下面的v传入时,必须定义宏RAPIDJSON_HAS_STDSTRING#define OBJ_ADD_STR_MEMBER(obj,k,...
  • qq_19390483
  • qq_19390483
  • 2018-03-16 19:05:47
  • 24

rapidjson库的使用

C++下最好的json库必然是MiloYip大神写的rapidjson库啦~   连cocos2dx官方都把这个库集成进去了 1 两个问题 (1)标准json和非标准json: 标准json要求...
  • u012234115
  • u012234115
  • 2014-12-31 15:47:06
  • 3946

C++项目RapidJson的详细用法总结

本文基于2018年1月最新仓库代码撰写 仓库: https://github.com/Tencent/rapidjson 用法: 将’include/rapidjson’文件夹copy到工程内直接...
  • u014449046
  • u014449046
  • 2018-01-16 00:38:48
  • 389
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 431
    排名: 11万+
    最新评论