1. 程式人生 > 其它 >cjson,rapidjson,yyjson解析精度對比

cjson,rapidjson,yyjson解析精度對比

一、前言
上一篇介紹了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.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] = "{\"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 }

執行結果: