[常用第三方库]RapidJSON

发表于2018-05-10
评论0 6.2k浏览
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)
nodeName:nodeName属性返回节点的名称
nodeValue:nodeValue属性返回或设置当前节点的值,格式为字符串
来自:https://blog.csdn.net/shimazhuge/article/details/71106079

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引