RapidJson简介

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属性返回或设置当前节点的值,格式为字符串

猜你喜欢

转载自blog.csdn.net/LearnLHC/article/details/79963356