;
执行结果:
结果说明:
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"
4 #include <iostream>
6 // g++ -g -o rapidjson_precision_test -std=c++11 precision_test.c
8 using namespace std;
10 int main()
11 {
12 char str_buf[1024] = "{\"random_code\":6996903014416199548}";
14 rapidjson::Document parse_doc;
16 parse_doc.Parse(str_buf);
18 // 确定有random_code场景,直接取值
19 cout << "random_code:" << parse_doc.FindMember("random_code")->value.GetUint64() << endl;
21 return 0;
执行结果:
三、yyjson解析精度测试
1 #include "yyjson.h"
3 #include <iostream>
5 // g++ -g -o yyjson_precision_test -std=c++11 precision_test.c yyjson.c
7 using namespace std;
9 int main()
10 {
11 char str_buf[1024] = "{\"random_code\":6996903014416199548}";
13 yyjson_doc *doc;
14 yyjson_val *root;
16 doc = yyjson_read(str_buf, strlen(str_buf), 0);
17 root = yyjson_doc_get_root(doc);
19 // 确定有random_code场景,直接取值
20 cout << "random_code:" << yyjson_get_uint(yyjson_obj_get(root, "random_code")) << endl;
22 yyjson_doc_free(doc);
23 return 0;
执行结果:
cjson无法解析64bit的大整数,rapidjson与yyjson可以正确解析。
如果json数据中存在大数的场景,显然cjson无法满足需求。
本文来自博客园,作者:T-BARBARIANS,转载请注明原文链接:https://www.cnblogs.com/t-bar/p/15152913.html 谢谢!