cjson,rapidjson,yyjson解析精度對比
阿新 • • 發佈:2021-08-17
一、前言
上一篇介紹了3種json解析工具的使用方法,對於基礎資料的解析沒有任何問題。
我們傳輸的json資料裡有unsigned long型資料,需要藉助json解析工具得到正確的unsigned long型資料。
本篇對比它們對64bit(8 byte)大整形資料的解析精度。
json樣本資料與上一篇一致,其中flow_id與key_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.c6 7 using namespace std; 8 9 int main() 10 { 11 cJSON *json_tmp; 12 cJSON *json_root; 13 14 char str_buf[1024] = "{\"host\":\"www.baidu.com\",\"hostlen\":13,\"uagent\":\"curl/7.29.0\",\"accept\":\"*/*\",\"method\":\"GET\",\"date\":\"Mon, 12 Jul 21 10:35:26 GMT\",\"timestamp\":\"2021-07-12T02:38:13.074829000\",\"protocol_type\":\"http\",\"source_ip\":\"::112.1.101.40\",\"source_port\":22291,\"destination_ip\":\"::112.2.81.190\",\"destination_port\":80,\"flow_timestamp\":\"2021-07-12 02:38:13.074829000\",\"flow_id\":6996903014416199548,\"key_id\":7449212903698783717,\"token\":\"1556198765_129_1_8BFE1790A603B9C0067938B07CB5BB94B6926B81\"}"; 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 }
執行結果:
三、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] = "{\"host\":\"www.baidu.com\",\"hostlen\":13,\"uagent\":\"curl/7.29.0\",\"accept\":\"*/*\",\"method\":\"GET\",\"date\":\"Mon, 12 Jul 21 10:35:26 GMT\",\"timestamp\":\"2021-07-12T02:38:13.074829000\",\"protocol_type\":\"http\",\"source_ip\":\"::112.1.101.40\",\"source_port\":22291,\"destination_ip\":\"::112.2.81.190\",\"destination_port\":80,\"flow_timestamp\":\"2021-07-12 02:38:13.074829000\",\"flow_id\":6996903014416199548,\"key_id\":7449212903698783717,\"token\":\"1556198765_129_1_8BFE1790A603B9C0067938B07CB5BB94B6926B81\"}"; 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] = "{\"host\":\"www.baidu.com\",\"hostlen\":13,\"uagent\":\"curl/7.29.0\",\"accept\":\"*/*\",\"method\":\"GET\",\"date\":\"Mon, 12 Jul 21 10:35:26 GMT\",\"timestamp\":\"2021-07-12T02:38:13.074829000\",\"protocol_type\":\"http\",\"source_ip\":\"::112.1.101.40\",\"source_port\":22291,\"destination_ip\":\"::112.2.81.190\",\"destination_port\":80,\"flow_timestamp\":\"2021-07-12 02:38:13.074829000\",\"flow_id\":6996903014416199548,\"key_id\":7449212903698783717,\"token\":\"1556198765_129_1_8BFE1790A603B9C0067938B07CB5BB94B6926B81\"}"; 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 }
執行結果: