前言
上一篇介绍了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大整数解析精度对比的更多相关文章

  1. [转载]JavaScript 中小数和大整数的精度丢失

    标题: JavaScript 中小数和大整数的精度丢失作者: Demon链接: http://demon.tw/copy-paste/javascript-precision.html版权: 本博客的 ...

  2. Java开发笔记(二十九)大整数BigInteger

    早期的编程语言为了节约计算机的内存,给数字变量定义了各种存储规格的数值类型,比如字节型byte只占用一个字节大小,短整型short占用两个字节大小,整型int占用四个字节大小,长整型long占用八个字 ...

  3. 自上而下,逐步揭开PHP解析大整数的面纱

    遇到的问题 最近遇到一个PHP大整数的问题,问题代码是这样的 $shopId = 17978812896666957068; var_dump($shopId); 上面的代码输出,会把$shopId转 ...

  4. js数字位数太大导致参数精度丢失问题

    最近遇到个比较奇怪的问题,js函数里传参,传一个位数比较大,打印arguments可以看到传过来的参数已经改变. 然后查了一下,发现确实是js精度丢失造成的.我的解决方法是将数字型改成字符型传输,这样 ...

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

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

  6. json系列(一)cjson,rapidjson,yyjson解析示例

    前言 项目上通过消息中间件传输json格式的数据,其他接收模块需要对json格式的数据进行解析,反序列化.对json解析工具有几个关注点,一是具备解析和构造的基础功能,二是具备解析和构造的高性能,三是 ...

  7. Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解

    Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全   Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...

  8. Web 前端开发精华文章集锦(jQuery、HTML5、CSS3)【系列二十】

    <Web 前端开发精华文章推荐>2013年第八期(总第二十期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 C ...

  9. [知识库分享系列] 二、.NET(ASP.NET)

    最近时间又有了新的想法,当我用新的眼光在整理一些很老的知识库时,发现很多东西都已经过时,或者是很基础很零碎的知识点.如果分享出去大家不看倒好,更担心的是会误人子弟,但为了保证此系列的完整,还是选择分享 ...

随机推荐

  1. 【一个小发现】VictoriaMetrics中:vm-storage的备份文件,无法给单机版使用

    首先导入一个按天的备份: vmrestore-prod \ -configFilePath="/etc/cos/config.ini" \ -credsFilePath=" ...

  2. [源码分析] Facebook如何训练超大模型 --- (3)

    [源码分析] Facebook如何训练超大模型 --- (3) 目录 [源码分析] Facebook如何训练超大模型 --- (3) 0x00 摘要 0x01 ZeRO-Offload 1.1 设计原 ...

  3. JavaCV的摄像头实战之二:本地窗口预览

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. Nginx代理的方式(反向代理)

    目录 一:Nginx 正向代理与反向代理 1.什么是代理服务器? 2.正向代理的概念 3. 反向代理的概念 二:Nginx代理服务支持的协议 三:Nginx代理实践 1.部署web01 2.部署lb0 ...

  5. Spring中的单例模式

    Spring中的单例模式 单例模式的介绍 1.1 简介 ​ 保证整个应用中某个实例有且只有一个 1.2作用 保证一个类仅有一个实例,并且提供一个访问它的全局访问点. 单例模式的优点和缺点 单例模式的优 ...

  6. python使用range()函数创建数字列表list

    #!/usr/bin/python #coding=utf-8 #好好学习,天天向上 numbers=list(range(1,6)) print(numbers) range指定步长: #!/usr ...

  7. Github新安全措施:停止Git客户端账号密码登录的解决方案

    今年 8 月 13 日之后,如果你还用账户密码来操作 Github 上的仓库,就会收到如下警告: remote: Support for password authentication was rem ...

  8. [POI2009]SLO-Elephants

    首先可以发现我们可以发现最终状态和初始状态都是一个大小为 \(n\) 的排列,且恰好有 \(n\) 种关系,于是我们对于每个 \(a_i\) 连一条 \(a_i \rightarrow b_i\) 的 ...

  9. bom案例3-放大镜

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  10. js中全局和局部变量的区别

    2 3 4 5 6 7 8 9 10 <script type="text/javascript"> var a = 1; function hehe() {      ...