[常用第三方库]RapidJSON
发表于2018-05-10
RapidJSON是一个C++的高性能的JSON解析器及生成器,同时支持SAX/DOM风格的API,针对有些人对RapidJSON还不是很了解,下面就和大家详细介绍下。
简介
- 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)
nodeValue:nodeValue属性返回或设置当前节点的值,格式为字符串
来自:https://blog.csdn.net/shimazhuge/article/details/71106079