json系列(二)cjson,rapidjson,yyjson大整数解析精度对比
前言
上一篇介绍了3种json解析工具的使用方法,对于基础数据的解析没有任何问题。
我们传输的json数据里有unsigned long型数据,需要借助json解析工具得到正确的unsigned long型数据。
本篇对比它们对64bit(8 byte)大整形数据的解析精度。json样本数据random_code为8 byte型大整数。


一、cjson解析精度测试
1 #include "cJSON.h"
2
3 #include <iostream>
4
5 // g++ -g -o cjson_precision_test -std=c++11 precision_test.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] = "{\"random_code\":6996903014416199548}";
15
16 json_root = cJSON_Parse(str_buf);
17
18 json_tmp = cJSON_GetObjectItem(json_root, "flow_id");
19 if(NULL != json_tmp) {
20 cout << "flow_id:" << json_tmp->valueint << endl;
21 cout << "flow_id:" << json_tmp->valuedouble << endl;
22 }
23
24 cJSON_Delete(json_root);
25 return 0;
26 }
执行结果:

结果说明:
1、json_tmp->valueint为singed int,可表示的最大整数为:2147483647
2、json_tmp->valuedouble为double类型。double默认为signed类型,最大只能表示63bit
3、通过gdb调试,cjson可表示的最大精度为16位(十进制)
即random_code为:6,903,014,416,199,548,json_tmp->valuedouble可正确表达;
当超过16位,即random_code为:96,903,014,416,199,548,cjson无法解析出正确的大数。
16位(十进制)正确表达

17位(十进制)错误表达,最后两位数据错误

二、rapidjson解析精度测试
1 #include "rapidjson/document.h"
2 #include "rapidjson/rapidjson.h"
3
4 #include <iostream>
5
6 // g++ -g -o rapidjson_precision_test -std=c++11 precision_test.c
7
8 using namespace std;
9
10 int main()
11 {
12 char str_buf[1024] = "{\"random_code\":6996903014416199548}";
13
14 rapidjson::Document parse_doc;
15
16 parse_doc.Parse(str_buf);
17
18 // 确定有random_code场景,直接取值
19 cout << "random_code:" << parse_doc.FindMember("random_code")->value.GetUint64() << endl;
20
21 return 0;
22 }
执行结果:

三、yyjson解析精度测试
1 #include "yyjson.h"
2
3 #include <iostream>
4
5 // g++ -g -o yyjson_precision_test -std=c++11 precision_test.c yyjson.c
6
7 using namespace std;
8
9 int main()
10 {
11 char str_buf[1024] = "{\"random_code\":6996903014416199548}";
12
13 yyjson_doc *doc;
14 yyjson_val *root;
15
16 doc = yyjson_read(str_buf, strlen(str_buf), 0);
17 root = yyjson_doc_get_root(doc);
18
19 // 确定有random_code场景,直接取值
20 cout << "random_code:" << yyjson_get_uint(yyjson_obj_get(root, "random_code")) << endl;
21
22 yyjson_doc_free(doc);
23 return 0;
24 }
执行结果:

结论
cjson无法解析64bit的大整数,rapidjson与yyjson可以正确解析。
如果json数据中存在大数的场景,显然cjson无法满足需求。
json系列(二)cjson,rapidjson,yyjson大整数解析精度对比的更多相关文章
- [转载]JavaScript 中小数和大整数的精度丢失
标题: JavaScript 中小数和大整数的精度丢失作者: Demon链接: http://demon.tw/copy-paste/javascript-precision.html版权: 本博客的 ...
- Java开发笔记(二十九)大整数BigInteger
早期的编程语言为了节约计算机的内存,给数字变量定义了各种存储规格的数值类型,比如字节型byte只占用一个字节大小,短整型short占用两个字节大小,整型int占用四个字节大小,长整型long占用八个字 ...
- 自上而下,逐步揭开PHP解析大整数的面纱
遇到的问题 最近遇到一个PHP大整数的问题,问题代码是这样的 $shopId = 17978812896666957068; var_dump($shopId); 上面的代码输出,会把$shopId转 ...
- js数字位数太大导致参数精度丢失问题
最近遇到个比较奇怪的问题,js函数里传参,传一个位数比较大,打印arguments可以看到传过来的参数已经改变. 然后查了一下,发现确实是js精度丢失造成的.我的解决方法是将数字型改成字符型传输,这样 ...
- json系列(三)cjson,rapidjson,yyjson解析性能对比
前言 本篇对cjson,rapidjson,yyjson三种json反序列化工具的性能进行对比. 有json样本数据如下: 实验环境: cpu:Xeon cpu主频:2.20GHz 以下示例均未对字段 ...
- json系列(一)cjson,rapidjson,yyjson解析示例
前言 项目上通过消息中间件传输json格式的数据,其他接收模块需要对json格式的数据进行解析,反序列化.对json解析工具有几个关注点,一是具备解析和构造的基础功能,二是具备解析和构造的高性能,三是 ...
- Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解
Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全 Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...
- Web 前端开发精华文章集锦(jQuery、HTML5、CSS3)【系列二十】
<Web 前端开发精华文章推荐>2013年第八期(总第二十期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 C ...
- [知识库分享系列] 二、.NET(ASP.NET)
最近时间又有了新的想法,当我用新的眼光在整理一些很老的知识库时,发现很多东西都已经过时,或者是很基础很零碎的知识点.如果分享出去大家不看倒好,更担心的是会误人子弟,但为了保证此系列的完整,还是选择分享 ...
随机推荐
- 【记录一个问题】铁威马nas,噪音太大了,我老婆说在客厅放了一个电饭锅
1.硬盘转动的噪音特别大,而且还是有很大IO的长时间猛转: 2.IO的管理算法,以及做IO的进程,都有很大问题.并未做任何操作,动不动就疯了一样硬盘猛转.
- 【记录一个问题】opencv中 cv::dft()与cv::ocl_dft()计算的结果相差较大
以一个跟踪算法来测试: 使用cv::dft(), 矩阵未按照2次幂对齐,最终跟踪平均准确率 84.3% 使用cv::dft(),矩阵使用cv::copyMakeBorder对齐,最终跟踪平均准确率 8 ...
- Web播放器
web视频播放器的使用及遇到的问题记录 TcPlayer播放器(腾讯Web超级播放器) https://cloud.tencent.com/document/product/881/20207 Ste ...
- 云原生新时代弄潮儿k8s凭什么在容器化方面独树一帜?
云原生新时代弄潮儿k8s凭什么在容器化方面独树一帜? Kubernetes 可以为做些什么? 在学习一种新技能之前,囧囧建议不要上去先看各种牛叉的实现,我们需要先搞清楚这个技能是什么?学习了之后能为我 ...
- kubernetes之添加删除node
添加node 1.master生成token [root@node-01 ~]# kubeadm token create --print-join-command kubeadm join 172. ...
- 010 Linux 文本统计与去重 (wc 和 uniq)
wc 命令一般是作为组合命令的一员与其他命令一同起到统计的作用.而一般情况下使用wc -l 命令较多. uniq 可检查文本文件中重复出现的行,一般与 sort 命令结合使用.一起组合搭配使用完成统计 ...
- Nacos服务注册与发现的2种实现方法!
Spring Cloud Alibaba 技术体系中的 Nacos,提供了两个重要的功能:注册中心(服务注册与发现)功能和配置中心功能. 其中注册中心解决了微服务调用中,服务提供者和服务调用者的解耦, ...
- linux下格式化json文件数据
一.使用 python -m json.tool cat test.json | python -m json.tool 二.jq格式化 在web 2.0时代json这种直观.灵活.高效数据格式基本已 ...
- Vuex 状态管理的工作原理
Vuex 状态管理的工作原理 为什么要使用 Vuex 当我们使用 Vue.js 来开发一个单页应用时,经常会遇到一些组件间共享的数据或状态,或是需要通过 props 深层传递的一些数据.在应用规模较小 ...
- java基础-抽象类与接口(转)
抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别. 一.抽象类 ...