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 ...
随机推荐
- thinkpad s5 电源功率不足提示
相关答案 作者:路灯瓜 链接:https://www.zhihu.com/question/47551448/answer/122578101 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权 ...
- java有四种访问权限
Java面向对象的封装性是通过对成员变量和方法进行访问控制实现的,访问控制分为4个等级:私有.默认.保护和公有,具体规则如下表:
- 前端vue-TinyMCE富文本编辑器表情插件报错解决
最近项目中需要使用文本编辑器,比较了下最终选择了TinyMCE这款富文本编辑器.我安装的是TinyMCE v5但是在使用表情插件的时候,表情一直都出不来,报错信息如下: Uncaught Syntax ...
- kubernetes之配置Metrics Server
Kubernetes 1.8 关于资源使用情况的 metrics,可以通过 Metrics API 获取到, Kubernetes 1.11 已经废弃 heapster.这里我们基于 Kubernet ...
- 学习Java第9天
今天所作的工作: 反射,枚举类型与泛型 明天工作: 1.线程 2.网络通信 所遇到的问题及解决方法: 反射基本思想,泛型类似于类模板. 理解反射太难了,转悠了好半天,关键是理解反射的思想,才容易学.
- HowToDoInJava Java 教程·翻译完成
原文:HowToDoInJava 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. ApacheCN 学习资源 目录 核心 Java 教程 什 ...
- Android--控件的滑动事件
感谢大佬:https://www.cnblogs.com/zkb-0928/p/3768209.html 感谢大佬:https://blog.csdn.net/sweiqin/article/deta ...
- 无法加载 mcrypt (外链,英语) 扩展,请检查您的 PHP 配置。
转载请注明来源:https://www.cnblogs.com/hookjc/ 需要安装libcrytp,在下面的地址下载libmarypt: ftp://mcrypt.hellug.gr/pub/c ...
- 7.2.*PHP编译安装时常见错误解决办法,php编译常见错误
configure: error: Cannot find ldap.h 检查下面是不是已经安装,如果没有安装之:检查:yum list openldapyum list openldap-dev ...
- Sping高质量博文链接集合
1. Spring事务传播行为详解 https://segmentfault.com/a/1190000013341344