json系列(一)cjson,rapidjson,yyjson解析示例
前言
项目上通过消息中间件传输json格式的数据,其他接收模块需要对json格式的数据进行解析,反序列化。
对json解析工具有几个关注点,一是具备解析和构造的基础功能,二是具备解析和构造的高性能,三是解析和构造的正确性。
本篇简单介绍三种json解析工具的使用方法,解析构造的正确性和性能对比在接下来的文章里介绍。
有json样本数据如下:

一、cjson解析示例
1 #include "cJSON.h"
2
3 #include <iostream>
4
5 // g++ -g -o cjson_parse_test -std=c++11 cjson_parse.c cJSON.c
6
7 using namespace std;
8
9 int main()
10 {
11 cJSON *json_tmp;
12 cJSON *json_root;
13
14 char str_buf[1024] = "{\"uri\":\"/uriCSh56j30cbGa\",\"host\":\"www.baidu.com\",\"uagent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/91.0.4472.124\",\"accept\":\"*/*\",\"method\":\"GET\",\"date\":\"Mon, 12 Jul 21 10:35:26 GMT\",\"resp_content_type\":\"video/fli\",\"status\":200,\"resp_content_length\":20480,\"timestamp\":\"2021-07-12T02:38:13.074829000\",\"traffic_id\":1057153235624398,\"protocol\":\"http\",\"src_ip\":\"112.1.101.40\",\"src_port\":22291,\"dst_ip\":\"112.2.81.190\",\"dst_port\":80,\"random_code\":7449212903698783717,\"feature_code\":\"y0BMEwnJ7RFICUAC5FKYkStTLVw=\"}";
15
16 json_root = cJSON_Parse(str_buf);
17
18 json_tmp = cJSON_GetObjectItem(json_root, "host");
19 if(NULL != json_tmp) {
20 cout << "host:" << json_tmp->valuestring << endl;
21 }
22
23 json_tmp = cJSON_GetObjectItem(json_root, "src_port");
24 if(NULL != json_tmp) {
25 cout << "hostlen:" << json_tmp->valueint << endl;
26 }
27
28 json_tmp = cJSON_GetObjectItem(json_root, "uagent");
29 if(NULL != json_tmp) {
30 cout << "uagent:" << json_tmp->valuestring << endl;
31 }
32
33 json_tmp = cJSON_GetObjectItem(json_root, "accept");
34 if(NULL != json_tmp) {
35 cout << "accept:" << json_tmp->valuestring << endl;
36 }
37
38 cJSON_Delete(json_root);
39 return 0;
40 }
执行结果:

二、rapidjson解析示例
1 #include <iostream>
2
3 #include "rapidjson/document.h"
4 #include "rapidjson/rapidjson.h"
5
6 // g++ -g -o rapidjson_parse_test -std=c++11 rapidjson_parse.c
7
8 using namespace std;
9
10 int main()
11 {
12 char str_buf[1024] = "{\"uri\":\"/uriCSh56j30cbGa\",\"host\":\"www.baidu.com\",\"uagent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/91.0.4472.124\",\"accept\":\"*/*\",\"method\":\"GET\",\"date\":\"Mon, 12 Jul 21 10:35:26 GMT\",\"resp_content_type\":\"video/fli\",\"status\":200,\"resp_content_length\":20480,\"timestamp\":\"2021-07-12T02:38:13.074829000\",\"traffic_id\":1057153235624398,\"protocol\":\"http\",\"src_ip\":\"112.1.101.40\",\"src_port\":22291,\"dst_ip\":\"112.2.81.190\",\"dst_port\":80,\"random_code\":7449212903698783717,\"feature_code\":\"y0BMEwnJ7RFICUAC5FKYkStTLVw=\"}";
13
14 rapidjson::Document parse_doc;
15
16 parse_doc.Parse(str_buf);
17
18 // 确定有host,直接取值
19 cout << "host:" << parse_doc.FindMember("host")->value.GetString() << endl;
20
21 // 确定有src_port,直接取值
22 cout << "src_port:" << parse_doc.FindMember("src_port")->value.GetInt() << endl;
23
24 // 不确定是否有uagent,先判断
25 if(parse_doc.HasMember("uagent")) {
26 cout << "uagent:" << parse_doc.FindMember("uagent")->value.GetString() << endl;
27 }
28
29 // 不确定是否有accept,先判断。
30 // 通过parse_doc["accept"]形式取值,但是这种方法取值性能没有FindMember高
31 if(parse_doc.HasMember("accept")) {
32 cout << "accept:" << parse_doc["accept"].GetString() << endl;
33 }
34
35 return 0;
36 }
执行结果:

三、yyjson解析示例
1 #include <iostream>
2
3 #include "yyjson.h"
4
5 // g++ -g -o yyjson_parse_test -std=c++11 yyjson_parse.c yyjson.c
6
7 using namespace std;
8
9 int main()
10 {
11 char str_buf[1024] = "{\"uri\":\"/uriCSh56j30cbGa\",\"host\":\"www.baidu.com\",\"uagent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/91.0.4472.124\",\"accept\":\"*/*\",\"method\":\"GET\",\"date\":\"Mon, 12 Jul 21 10:35:26 GMT\",\"resp_content_type\":\"video/fli\",\"status\":200,\"resp_content_length\":20480,\"timestamp\":\"2021-07-12T02:38:13.074829000\",\"traffic_id\":1057153235624398,\"protocol\":\"http\",\"src_ip\":\"112.1.101.40\",\"src_port\":22291,\"dst_ip\":\"112.2.81.190\",\"dst_port\":80,\"random_code\":7449212903698783717,\"feature_code\":\"y0BMEwnJ7RFICUAC5FKYkStTLVw=\"}";
12
13 yyjson_val *key;
14
15 yyjson_doc *doc;
16 yyjson_val *root;
17
18 doc = yyjson_read(str_buf, strlen(str_buf), 0);
19 root = yyjson_doc_get_root(doc);
20
21 // 确定有host,直接取值
22 cout << "host:" << yyjson_get_str(yyjson_obj_get(root, "host")) << endl;
23
24 // 确定有src_port,直接取值
25 cout << "src_port:" << yyjson_get_int(yyjson_obj_get(root, "src_port")) << endl;
26
27 // 不确定是否有uagent,先判断
28 if(NULL != (key = yyjson_obj_get(root, "uagent"))) {
29 cout << "uagent:" << yyjson_get_str(key) << endl;
30 }
31
32 // 不确定是否有accept,先判断
33 if(NULL != (key = yyjson_obj_get(root, "accept"))) {
34 cout << "accept:" << yyjson_get_str(key) << endl;
35 }
36
37 yyjson_doc_free(doc);
38 return 0;
39 }
执行结果:

结论
三种json解析工具都可以完成基础的数据解析,看似没有区别,好像可以任选一种。
但是,如果对数据解析的正确性,高效性有要求,就需要做相关取舍了,具体分析请看后续文章。
json系列(一)cjson,rapidjson,yyjson解析示例的更多相关文章
- json系列(三)cjson,rapidjson,yyjson解析性能对比
前言 本篇对cjson,rapidjson,yyjson三种json反序列化工具的性能进行对比. 有json样本数据如下: 实验环境: cpu:Xeon cpu主频:2.20GHz 以下示例均未对字段 ...
- json系列(二)cjson,rapidjson,yyjson大整数解析精度对比
前言上一篇介绍了3种json解析工具的使用方法,对于基础数据的解析没有任何问题.我们传输的json数据里有unsigned long型数据,需要借助json解析工具得到正确的unsigned long ...
- rapidjson常见使用示例
目录 目录 1 1. 前言 2 2. Move语意 2 3. rapidjson::Document 2 4. 成员迭代器MemberIterator 3 5. 数组迭代器ValueIterator ...
- 【转】 cJSON 源码解析
关于cjson的介绍和使用方法就不在这里介绍了,详情请查看上一篇博客cjson使用方法. JSON的内存结构像广义表,可以认为是有层次的双向链表. cJSON程序中的细节点如下: 大量宏替换 大量静态 ...
- 【Flask-RESTPlus系列】Part3:请求解析
0x00 内容概览 请求解析 基本参数 必需参数 多值和列表 其他目标 参数位置 参数多个位置 高级类型处理 解析器继承 文件上传 错误处理 错误消息 参考链接 0x01 请求解析 注意:Flask- ...
- Mybatis 系列8-结合源码解析select、resultMap的用法
[Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ...
- Mybatis 系列7-结合源码解析核心CRUD 配置及用法
[Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ...
- Mybatis 系列3-结合源码解析properties节点和environments节点
[Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ...
- asp.net core系列 39 Razor 介绍与详细示例
原文:asp.net core系列 39 Razor 介绍与详细示例 一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor ...
随机推荐
- 【机器学习】HMM
机器学习算法-HMM 目录 机器学习算法-HMM 1. 模型定义 2. 序列生成 3. 概率计算 3.1 前向计算 3.2 后向计算 4. 学习 4.1 求解 4.2 求解 4.3 求解 5. 预测 ...
- 【记录一个问题】linux下使用opencv中的UMat,性能并未提升,反而略有下降
使用后性能略微下降,一开始怀疑是UMat拷贝的问题.运行 nvidia-smi -l 1, 发现GPU占用始终为0.说明opencl使用的是CPU版本,而不是GPU版本.明天试验opencl的GPU版 ...
- web自动化-selenium 入门篇
selenium安装介绍 selenium是web浏览器的自动化工具 官网:https://www.selenium.dev 构成: WebDriver: 浏览器提供的浏览器api来控制浏览器(模拟用 ...
- echarts x轴的纵向区域随便点击获取点击的x轴那一纵向区域的值
1.现在xAxis里面配置一下: 2.在生成图表的后面加入框起来的部分 myChart.getZr().on('click', function (params) { /* 通过获取echarts上面 ...
- Natasha 4.0 探索之路系列(三) 基本的动态编译
Natasha 的设计 动态编译 Roslyn 为开发者提供了动态编译的接口, 允许我们以 C# 代码来编写 Emit 或 表达式树生成的程序集, 但是完成一个编译需要诸多步骤, 用户参与的操作也很多 ...
- ☕【Java深层系列】「并发编程系列」深入分析和研究MappedByteBuffer的实现原理和开发指南
前言介绍 在Java编程语言中,操作文件IO的时候,通常采用BufferedReader,BufferedInputStream等带缓冲的IO类处理大文件,不过java nio中引入了一种基于Mapp ...
- 学习JAVAWEB第十三天
会话技术 1. 会话:一次会话中包含多次请求和响应. * 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止 2. 功能:在一次会话的范围内的多次请求间,共享数据 3. 方式: ...
- JavaScripts之柯里化与偏函数
参考资料:https://github.com/mqyqingfeng/Blog/issues/42 柯里化(Currying): 定义:柯里化是表示将某个多参数的函数转换为一系列只有一个参数的函数的 ...
- JVM内存模型(五)
一.JVM内存模型 1.1.与运行时数据区 前面讲过了运行时数据区那接下来我们聊下内存模型,JVM的内存模型指的是方法区和堆:在很多情况下网上讲解会把内存模型和运行时数据区认为是一个东西,这是 ...
- Github上点赞90k的计算机基础、操作系统、网络笔记,赶紧收藏
最近,有粉丝发消息给我,说想要好好学习计算机,但是找不到门路啊,所以小编打算给大家推荐一些很奈斯的计算机学习的资料,希望大家赶紧收藏起来好好学习. 资料分为四份,给大家展示了部分内容,头条受限,无法全 ...