前言

项目上通过消息中间件传输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解析示例的更多相关文章

  1. json系列(三)cjson,rapidjson,yyjson解析性能对比

    前言 本篇对cjson,rapidjson,yyjson三种json反序列化工具的性能进行对比. 有json样本数据如下: 实验环境: cpu:Xeon cpu主频:2.20GHz 以下示例均未对字段 ...

  2. json系列(二)cjson,rapidjson,yyjson大整数解析精度对比

    前言上一篇介绍了3种json解析工具的使用方法,对于基础数据的解析没有任何问题.我们传输的json数据里有unsigned long型数据,需要借助json解析工具得到正确的unsigned long ...

  3. rapidjson常见使用示例

    目录 目录 1 1. 前言 2 2. Move语意 2 3. rapidjson::Document 2 4. 成员迭代器MemberIterator 3 5. 数组迭代器ValueIterator ...

  4. 【转】 cJSON 源码解析

    关于cjson的介绍和使用方法就不在这里介绍了,详情请查看上一篇博客cjson使用方法. JSON的内存结构像广义表,可以认为是有层次的双向链表. cJSON程序中的细节点如下: 大量宏替换 大量静态 ...

  5. 【Flask-RESTPlus系列】Part3:请求解析

    0x00 内容概览 请求解析 基本参数 必需参数 多值和列表 其他目标 参数位置 参数多个位置 高级类型处理 解析器继承 文件上传 错误处理 错误消息 参考链接 0x01 请求解析 注意:Flask- ...

  6. Mybatis 系列8-结合源码解析select、resultMap的用法

    [Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ...

  7. Mybatis 系列7-结合源码解析核心CRUD 配置及用法

    [Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ...

  8. Mybatis 系列3-结合源码解析properties节点和environments节点

    [Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ...

  9. asp.net core系列 39 Razor 介绍与详细示例

    原文:asp.net core系列 39 Razor 介绍与详细示例 一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor ...

随机推荐

  1. 【记录一个问题】thinkpad x1笔记本,安装ubuntu 16后,拔掉U盘,总是启动到windows,无法启动到ubuntu

    如题 昨天使用ubuntu 18没有这个问题 ============================= 12:38 1.安装完成出现重启后,一定要拔掉U盘 2.BIOS里面的security boo ...

  2. VUE3 之 组件传参

    1. 概述 韦奇定律告诉我们:大部分人都很容易被别人的话所左右,从而开始动摇.怀疑,最终迷失自我.因此我们要努力的坚定信念,相信自己,才不会被周围的环境所左右,才能取得最终的胜利. 言归正传,之前我们 ...

  3. vivo数据库与存储平台的建设和探索

    本文根据Xiao Bo老师在"2021 vivo开发者大会"现场演讲内容整理而成.公众号回复[2021VDC]获取互联网技术分会场议题相关资料. 一.数据库与存储平台建设背景 以史 ...

  4. 用最笨的方法实现java控制台日历打印

    如果想用户自定义输入日期查询,可以通过Calendar的set方法和Scanner方法设置 Calendar类简单使用:https://blog.csdn.net/weixin_43670802/ar ...

  5. JVM学习十四 - (复习)类文件结构

    类文件结构 JVM 的"无关性" 谈论 JVM 的无关性,主要有以下两个: 平台无关性:任何操作系统都能运行 Java 代码 语言无关性: JVM 能运行除 Java 以外的其他代 ...

  6. Git Push 免输 用户名和密码

    前言 在大家使用github的过程中,一定会碰到这样一种情况,就是每次要push 和pull时总是要输入github的账号和密码,这样不仅浪费了大量的时间且降低了工作效率.在此背景下,本文在网上找了两 ...

  7. Xcode全系列下载地址

    Xcode全系列下载地址,不断更新dmg 格式 下载链接:http://pan.baidu.com/s/1mgyxLP2

  8. K8s二进制部署单节点 master组件 node组件 ——头悬梁

    K8s二进制部署单节点   master组件 node组件   --头悬梁 1.master组件部署 2.node   组件部署 k8s集群搭建: etcd集群 flannel网络插件 搭建maste ...

  9. Docker consul的容器服务更新与发现(超详细配图)

    Docker consul的容器服务更新与发现 1.概述 2.部署 1.概述: (1)什么是服务注册与发现: 服务注册与发现是微服务架构中不可或缺的重要组件.起初服务都是单节点的,不保障高可用性,也不 ...

  10. 部署YUM仓库及NFS共享服务

    部署YUM仓库及NFS共享服务 目录 部署YUM仓库及NFS共享服务 一.YUM仓库服务 1. YUM概述 2. 部署YUM软件仓库 (1)准备安装源 ①YUM仓库的种类 ②RPM软件包的来源 ③构建 ...