cjson,rapidjson,yyjson大整數解析精度對比


前言
上一篇介紹了3種json解析工具的使用方法,對於基礎數據的解析沒有任何問題。
我們傳輸的json數據里有unsigned long型數據,需要借助json解析工具得到正確的unsigned long型數據。
本篇對比它們對64bit(8 byte)大整形數據的解析精度。json樣本數據flow_id為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] = "{\"flow_id\":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位(十進制)

即flow_id為:6,903,014,416,199,548,json_tmp->valuedouble可正確表達;

當超過16位,即flow_id為: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] = "{\"flow_id\":6996903014416199548}";
13 
14     rapidjson::Document parse_doc;
15     
16     parse_doc.Parse(str_buf);
17 
18     // 確定有flow_id場景,直接取值
19     cout << "flow_id:" << parse_doc.FindMember("flow_id")->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] = "{\"flow_id\":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     // 確定有flow_id場景,直接取值
20     cout << "flow_id:" << yyjson_get_uint(yyjson_obj_get(root, "flow_id")) << endl;
21 
22     return 0;
23 }

執行結果:

 

結論

cjson無法解析64bit的大整數,rapidjson與yyjson可以正確解析。

如果json數據中存在大數的場景,顯然cjson無法滿足需求。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM