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 ...
随机推荐
- 分布式一致性协议Raft,以及难搞的Paxos
https://blog.csdn.net/colorant/article/details/73887706
- golang中的标准库flag
Go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单. os.Args 如果你只是简单的想要获取命令行参数,可以像下面的代码示例一样使用os.Args来获取命令行参数. ...
- socket编程(struct报头)网络编程
目录 一:socket编程 1.简介 2.参数说明: 3.socket套接字方法 4.socket编程思路: 二:socket套接字编程 1.socket简易版编程 2.通信循环 三:通信循环及代码优 ...
- python引用列表--10
#!/usr/bin/python #coding=utf-8 #好好学习,天天向上 python=["a","b","c","d ...
- plsql 存储过程 介绍。
/* 7-22 知识总结? 1. 存储过程 2.函数 3.包 */ /*1.什么是存储过程? 语法? 存储过程:类似于Java中的方法:完成一个特定的功能,一系列代码 (增删改操作和一些逻辑判断,se ...
- switch多选择结构
switch多选择结构 多选择结构还有一个实现方式就是switch case语句. switch case 语句判断一个变量与一个系列值中某个值是否相等,每个值称为一个分支. 语法: switch(e ...
- [源码解析] 模型并行分布式训练 Megatron (3) ---模型并行实现
[源码解析] 模型并行分布式训练 Megatron (3) ---模型并行实现 目录 [源码解析] 模型并行分布式训练 Megatron (3) ---模型并行实现 0x00 摘要 0x01 并行Tr ...
- 使用JMX Exporter监控Rainbond上的Java应用
场景 Prometheus 社区开发了 JMX Exporter 用于导出 JVM 的监控指标,以便使用 Prometheus 来采集监控数据.当您的 Java 应用部署在Rainbond上后 可通过 ...
- 普通web项目一直无法访问页面,直接报404
错误:普通web项目一直无法访问页面,直接报404 原因:写了一个过滤乱码的类: 而在类上加了WebServlet注解,其实应该是WebFilter注解, 总结:基础不扎实,有些东西只会用,而不知道原 ...
- IDE连接数据库时测试Test Connection 无法点击
问题: IDE连接数据库时测试Test Connection 无法点击 解决: IDE缺少对应的驱动 第一步: 点击驱动 第二步: 下载驱动 注意:不同版本的驱动下载位置不同,此版本为2017