RapidJSON简介及使用

article/2025/10/4 8:36:01

RapidJSON是腾讯开源的一个高效的C++ JSON解析器及生成器,它是只有头文件的C++库。RapidJSON是跨平台的,支持Windows, Linux, Mac OS X及iOS, Android。它的源码在GitHub - Tencent/rapidjson: A fast JSON parser/generator for C++ with both SAX/DOM style API,稳定版本为2016年发布的1.1.0版本。

RapidJSON特点:

(1). RapidJSON小而全:它同时支持SAX和DOM风格的API,SAX解析器只有约500行代码。

(2). RapidJSON快:它的性能可与strlen()相比,可支持SSE2/SSE4.2加速,使用模版及内联函数去降低函数调用开销。

(3). RapidJSON独立:它不依赖于BOOST等外部库,它甚至不依赖于STL。

(4). RapidJSON对内存友好:在大部分32/64位机器上,每个JSON值只占16字节(除字符串外),它预设使用一个快速的内存分配器,令分析器可以紧凑地分配内存。

(5). RapidJSON对Unicode友好:它支持UTF-8、UTF-16、UTF-32(大端序/小端序),并内部支持这些编码的检测、校验及转码。例如,RapidJSON可以在分析一个UTF-8文件至DOM (Document Object Model, 文件对象模型)时,把当中的JSON字符串转码至UTF-16。它也支持代理对(surrogate pair)及"\u0000"(空字符)。

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

以上内容摘自:http://rapidjson.org/zh-cn/,关于RapidJSON的更详细介绍可以参考此网页。

           以下是测试代码(test_rapidjson.cpp):

#include "funset.hpp"
#include "rapidjson/document.h"
//#include "rapidjson/writer.h"
#include "rapidjson/prettywriter.h"
#include "rapidjson/stringbuffer.h"
#include <iostream>
#include <fstream>
#include <string>
#include "common.hpp"int test_rapidjson_parse()
{
#ifdef _MSC_VERconst char* file_name = "E:/GitCode/Messy_Test/testdata/json.data";
#elseconst char* file_name = "testdata/json.data";
#endifstd::ifstream in(file_name);if (!in.is_open()) {fprintf(stderr, "fail to read json file: %s\n", file_name);return -1;}std::string json_content((std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>());in.close();rapidjson::Document dom;if (!dom.Parse(json_content.c_str()).HasParseError()) {if (dom.HasMember("name") && dom["name"].IsString()) {fprintf(stdout, "name: %s\n", dom["name"].GetString());}if (dom.HasMember("address") && dom["address"].IsString()) {fprintf(stdout, "address: %s\n", utf8_to_gbk(dom["address"].GetString()));}if (dom.HasMember("age") && dom["age"].IsInt()) {fprintf(stdout, "age: %d\n", dom["age"].GetInt());}const char* tmp = "xxx";if (!dom.HasMember(tmp)) {fprintf(stdout, "Warning: it has no member: %s\n", tmp);}if (dom.HasMember("value1") && dom["value1"].IsArray()) {const rapidjson::Value& arr = dom["value1"];for (int i = 0; i < arr.Size(); ++i) {const rapidjson::Value& tmp = arr[i];fprintf(stdout, "value1:\ni = %d:", i);for (int j = 0; j < tmp.Size(); ++j) {if (tmp[j].IsInt())fprintf(stdout, "%d, ", tmp[j].GetInt());if (tmp[j].IsFloat())fprintf(stdout, "%.1f, ", tmp[j].GetFloat());}fprintf(stdout, "\n");}}if (dom.HasMember("value2") && dom["value2"].IsArray()) {const rapidjson::Value& arr = dom["value2"];fprintf(stdout, "value2: ");for (int i = 0; i < arr.Size(); ++i) {fprintf(stdout, "%.2f, ", arr[i].GetFloat());}fprintf(stdout, "\n");}if (dom.HasMember("bei_jing") && dom["bei_jing"].IsObject()) {const rapidjson::Value& obj = dom["bei_jing"];if (obj.HasMember("address") && obj["address"].IsString()) {fprintf(stdout, "address: %s\n", utf8_to_gbk(obj["address"].GetString()));}if (obj.HasMember("car") && obj["car"].IsBool()) {fprintf(stdout, "car: %d\n", obj["car"].GetBool());}if (obj.HasMember("cat") && obj["cat"].IsBool()) {fprintf(stdout, "cat: %d\n", obj["cat"].GetBool());}}if (dom.HasMember("shan_dong") && dom["shan_dong"].IsObject()) {const rapidjson::Value& obj = dom["shan_dong"];if (obj.HasMember("address") && obj["address"].IsString()) {fprintf(stdout, "address: %s\n", utf8_to_gbk(obj["address"].GetString()));}if (obj.HasMember("value1") && obj["value1"].IsArray()) {const rapidjson::Value& arr = obj["value1"];if (arr[0].HasMember("ji_nan") && arr[0]["ji_nan"].IsString()) {fprintf(stdout, "ji_nan: %s\n", utf8_to_gbk(arr[0]["ji_nan"].GetString()));}if (arr[0].HasMember("tai_an") && arr[0]["tai_an"].IsString()) {fprintf(stdout, "tai_an: %s\n", utf8_to_gbk(arr[0]["tai_an"].GetString()));}}}} else {fprintf(stderr, "fail to parse json file: %s\n", file_name);return -1;}// iter jsonfor (rapidjson::Value::ConstMemberIterator iter = dom.MemberBegin(); iter != dom.MemberEnd(); ++iter) {fprintf(stdout, "iter json name: %s, type: %d\n", iter->name.GetString(), iter->value.GetType());}return 0;
}int test_rapidjson_write()
{rapidjson::StringBuffer buf;//rapidjson::Writer<rapidjson::StringBuffer> writer(buf);rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buf); // it can word wrapwriter.StartObject();writer.Key("name"); writer.String("spring");writer.Key("address"); writer.String("北京");writer.Key("age"); writer.Int(30);writer.Key("value1");writer.StartArray();writer.StartArray();writer.Double(23); writer.Double(43); writer.Double(-2.3); writer.Double(6.7);     writer.Double(90);writer.EndArray();writer.StartArray();writer.Int(-9); writer.Int(-19); writer.Int(10); writer.Int(2);writer.EndArray();writer.StartArray();writer.Int(-5); writer.Int(-55);writer.EndArray();writer.EndArray();writer.Key("value2");writer.StartArray();writer.Double(13.3); writer.Double(1.9); writer.Double(2.10);writer.EndArray();writer.Key("bei_jing");writer.StartObject();writer.Key("address"); writer.String("海淀");writer.Key("car"); writer.Bool(false);writer.Key("cat"); writer.Bool(true);writer.EndObject();writer.Key("shan_dong");writer.StartObject();writer.Key("address"); writer.String("济南");writer.Key("value1");writer.StartArray();writer.Key("ji_nan"); writer.String("趵突泉");writer.Key("tai_an"); writer.String("泰山");writer.EndArray();writer.EndObject();writer.EndObject();const char* json_content = buf.GetString();fprintf(stdout, "json content: %s\n", json_content);#ifdef _MSC_VERconst char* file_name = "E:/GitCode/Messy_Test/testdata/out.json";
#elseconst char* file_name = "testdata/out.json";
#endifstd::ofstream outfile;outfile.open(file_name);if (!outfile.is_open()) {fprintf(stderr, "fail to open file to write: %s\n", file_name);return -1;}outfile << json_content << std::endl;outfile.close();return 0;
}

json.data内容如下:

{"name": "spring","address": "北京","age": 30,"value1": [[23, 43, -2.3, 6.7, 90],[-9, -19, 10, 2],[-5, -55]],"value2": [13.3, 1.9, 2.10],"bei_jing": {"address": "海淀","car": false,"cat": true},"shan_dong": {"address": "济南","value1": [{"ji_nan": "趵突泉"}, {"tai_an": "泰山"}]}
}

test_rapidjson_parse的执行结果如下:与实际结果一致

test_rapidjson_write的执行结果如下:与预期一致,将rapidjson::Writer<rapidjson::StringBuffer> writer(buf)调整为rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buf);可使结果自动换行

GitHub:GitHub - fengbingchun/Messy_Test: C++/C++11/C++14's usage


http://chatgpt.dhexx.cn/article/yRgxt73p.shtml

相关文章

JSON--rapidjson介绍

JSON--rapidjson 1 RapidJSON简介2 C/C Json库对比一致性解析时间解析内存Stringify Time&#xff08;string 2 json&#xff09;Prettify Time&#xff08;美化格式时间&#xff09;代码大小 3 几个重点库介绍rapidjsonnlohmann-jsonjsoncppcjson 参考 1 RapidJSON简介 Rapid…

RapidJSON入门:手把手教入门实例介绍

RapidJSON优点 跨平台 编译器&#xff1a;Visual Studio、gcc、clang 等 架构&#xff1a;x86、x64、ARM 等 操作系统&#xff1a;Windows、Mac OS X、Linux、iOS、Android 等 容易安装 只有头文件的库。只需把头文件复制至你的项目中。 独立、最小依赖 不需依赖 STL、BOOST …

oracle listagg如何去重

listagg去重 去重思路&#xff1a;利用listagg会忽略null值的特点 按ENTITY_GROUP_RRN 分组&#xff0c;用 listagg 分别合并 EQPT_ID 与 STATION_ID &#xff0c;同时要求去重 表 T_TEST 数据如下&#xff1a; EQPT_IDENTITY_GROUP_RRNSTATION_IDTOOL-00110493721JITAI-1TO…

mysql listagg within_Oracle的 listagg() WITHIN GROUP ()函数使用

1.使用条件查询 查询部门为20的员工列表 -- 查询部门为20的员工列表 SELECT t.DEPTNO,t.ENAME FROM SCOTT.EMP t where t.DEPTNO 20 ; 效果&#xff1a; 2.使用 listagg() WITHIN GROUP () 将多行合并成一行 SELECT T .DEPTNO, listagg (T .ENAME, ,) WITHIN GROUP (ORDER …

listagg结果去重

最近在一个项目中用到了listagg方法&#xff0c;但是在组合结果中出现有重复的情况。默认的结果如下 于是我就写了一个方法对listagg的结果去重&#xff0c;也可以对该格式的字符串去重&#xff0c;方法如下 create or replace function listaggpure(targetStr varchar2,seper…

Oracle函数之listagg函数

语法 有点难以看懂&#xff0c;个人理解listagg是list aggregate的缩写&#xff08;错了勿喷&#xff09;&#xff0c;也就是列表总计&#xff0c;聚合的意思。 官方文档解释为&#xff1a; LISTAGG orders data within each group specified in the ORDER BY clause and then …

listagg()行转列函数

--基础数据 DROP TABLE "ZYH_TEST"; CREATE TABLE "ZYH_TEST" ("ID" NUMBER(19) NOT NULL ,"NAME" VARCHAR2(255 BYTE) ,"CREATETIME" DATE ,"SCORE" NUMBER ,"CLASSID" VARCHAR2(255 BYTE) )INSERT I…

oracle listagg支持,PostgreSQL行列转换(兼容oracle listagg)

oracle11g开始支持的listagg函数替代了wmconcat来实现行列转换的功能。 listagg函数的用法: oracle行列转换例子: —建表https://www.cndba.cn/foucus/article/3929https://www.cndba.cn/foucus/article/3929 SQL> create table b (id number,name varchar2(20)); Table c…

mysql listagg函数_SQLSERVER中的ListAGG

跃然一笑 MySQLSELECT FieldA , GROUP_CONCAT(FieldB ORDER BY FieldB SEPARATOR ,) AS FieldBs FROM TableName GROUP BY FieldA ORDER BY FieldA;Oracle&DB2SELECT FieldA , LISTAGG(FieldB, ,) WITHIN GROUP (ORDER BY FieldB) AS FieldBs FROM TableName GRO…

mysql listagg within_Oracle函数之LISTAGG

最近在学习的过程中&#xff0c;发现一个挺有意思的Oracle函数&#xff0c;它可实现对列值的拼接。下面我们来看看其具体用法。 最近在学习的过程中&#xff0c;发现一个挺有意思的Oracle函数&#xff0c;它可实现对列值的拼接。下面我们来看看其具体用法。 用法&#xff1a; 对…

listagg

1.创建数据表&#xff0c;准备测试数据 CREATE TABLE MK_STUDENT(ID NUMBER(18) NOT NULL,STU_NAME VARCHAR2(200),STU_SCORE VARCHAR2(50),PRIMARY KEY (ID) ); ALTER TABLE MK_STUDENT ADD KEMU VARCHAR2(200);INSERT INTO MK_STUDENT (ID,STU_NAME,STU_SCORE,KEMU) VALUES …

listagg( )详解

想象一个场景&#xff0c;现实生活中一个人有许多手机号已是常态&#xff0c;数据库中也会有类似的结构。 大家肯定想知道listagg()有什么样的效果&#xff1a; 案列分析 一个表中有许多数据&#xff0c;名字叫张三的有许多手机号。希望查询结果出来是分组且清晰。 select …

Oracle列转行函数 Listagg()详解

详解 listagg()函数可以实现多列记录聚合为一条记录&#xff0c;从而实现数据的压缩、致密化&#xff08;data densification&#xff09; 基本用法 像聚合函数一样&#xff0c;通过Group by语句&#xff0c;把每个Group的一个字段&#xff0c;拼接起来 LISTAGG(XXX,XXX) WI…

Oracle 中 LISTAGG 函数的介绍以及使用

LISTAGG 函数介绍 listagg 函数是 Oracle 11.2 推出的新特性。 其主要功能类似于 wmsys.wm_concat 函数&#xff0c; 即将数据分组后&#xff0c; 把指定列的数据再通过指定符号合并。LISTAGG 使用 listagg 函数有两个参数&#xff1a;1、 要合并的列名2、 自定义连接符号☆L…

矩阵乘以其矩阵转置求导-数学

20210703 矩阵论 https://zhuanlan.zhihu.com/p/288541909?utm_sourcewechat_session 矩阵运算法则 20210529 https://blog.csdn.net/Lisa_Ren_123/article/details/81983785 矩阵转置求导 https://jingyan.baidu.com/article/da1091fb69f0b7027849d612.html

matlab中怎么求矩阵的转置

第一步我们首先需要知道matlab中矩阵后面加单引号是共轭转置&#xff0c;加点和单引号是转置&#xff0c;如下图所示&#xff1a; matlab中怎么求矩阵的转置 第二步在matlab命令行窗口中输入“ A[1 2 4;5 6 7]”&#xff0c;如下图所示&#xff1a; matlab中怎么求矩阵的转…

矩阵的转置等于矩阵的逆

http://zhidao.baidu.com/question/334500638.html 百度知道三个回答 矩阵A的转置矩阵A^T等于A的逆矩阵A^-1 那么AA^TAA^-1E 设A(α1&#xff0c;α2&#xff0c;α3&#xff0c;...&#xff0c;αn)^T&#xff0c;其中αi为n维列向量&#xff0c; 那么A^T(α1&#xff0c;α2&…

矩阵转置运算简单总结

矩阵转置的运算规律&#xff1a; &#xff08;1&#xff09;; &#xff08;2&#xff09;; &#xff08;3&#xff09;; &#xff08;4&#xff09;; &#xff08;5&#xff09;