前言
上一篇介绍了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. 【记录一个问题】golang神坑,明明返回了接口指针类型的nil值,却无法用if判断

    先看看导致异常的代码: package main import ( "fmt" "log" ) type MyError1 struct{ MyErrorCod ...

  2. 小程序或者vue,解决菜单导航做做成轮播的样子

    案例: 其中最重要的思路就是如何让第二次或第三次以及后面的轮播有数据: 做法大致跟轮播图做法一样,只不过我们需要进行书写样式,代码如下: <!-- 做一个轮播图navbar demo --> ...

  3. 44.Prim算法

    public static void main(String[] args) { //测试看看图是否创建ok char[] data = new char[]{'A','B','C','D','E', ...

  4. Filter-完整的用户登录和权限检查

    Filter过滤器的使用步骤: 1,编写一个类去实现Filter接口 2,实现拦截(过滤)方法doFilter() 3,到web.xml中配置Filter的拦截路径 补充login.jsp登录页面 编 ...

  5. C++智能指针使用说明

    导读 STL提供四种智能指针:auto_ptr.unique_ptr.shared_ptr和weak_ptr.其中auto_ptr是C++98提供的解决方案,C++11以后均已摒弃.所有代码在gcc ...

  6. Entity Framework 在OrderBy排序中使用字符串

    public static class LinqExtensions { private static PropertyInfo GetPropertyInfo(Type objType, strin ...

  7. linux上printf出带颜色字体

    转载请注明来源:https://www.cnblogs.com/hookjc/ 统一定义: #define NONE         "\033[m"  #define RED   ...

  8. @play.data.binding.NoBinding

    新的@play.data.binding.NoBinding注解允许我们定义一些"不应该被绑定"的字段,以防出现安全问题.例如: public class User extends ...

  9. LVS负载均衡群集部署——DR模式

    LVS负载均衡群集部署--DR模式 1.LVS-DR概述 2.部署实验 1.LVS-DR概述: LVS-DR(Linux Virtual Server Director Server)工作模式,是生产 ...

  10. 【CF792E】Colored Balls(数论分块)

    题目链接 大意 有\(N\)种颜色的球,第\(i\)种球有\(Ai\)个,要求把球分成几个集合,使得: 一个集合里的球只能有一种颜色. 任意两个集合的球的数量相差不能超过1. 求这些球至少需要分几个集 ...