前言
上一篇介紹了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無法滿足需求。