背景
JSON即JavaScript Object Notation,是一種輕量級的數據交換格式。
JSON建構於兩種結構:
- “名稱/值”對的集合(A collection of name/value pairs)。不同的語言中,它被理解為對象(object),紀錄(record),結構(struct),字典(dictionary),哈希表(hash table),有鍵列表(keyed list),或者關聯數組 (associative array)。
- 值的有序列表(An ordered list of values)。在大部分語言中,它被理解為數組(array)。
關於JSON庫的性能評測與標准符合程度,可以參照《28 個 C/C++ 開源 JSON 程序庫性能及標准符合程度評測》,另一個英文版更詳細結果在nativejson-benchmark。
在閱讀了一系列評測之后,結合需求(ROM盡量小,RAM盡量小,帶處理的數據比較簡單),准備研究一下cJSON和json-c。
從JSON官網獲得json-c和cJSON的源碼地址如下:cJSON和json-c。
下面就基於這兩份代碼在Ubuntu進行速度和兼容性測試。
測試標的構造對於測試的覆蓋以及測試有效性非常重要,所幸的在AOSP中有一個參考AOSP/external/jsoncpp/test。
cJSON
下載代碼:
git clone https://github.com/arnoldlu/cJSON.git |
編譯安裝:
mkdir build cd build cmake .. -DENABLE_CJSON_UTILS=Off -DENABLE_CJSON_TEST=On -DCMAKE_INSTALL_PREFIX=/usr (生成bin+lib) cmake .. -DENABLE_CJSON_UTILS=Off -DENABLE_CJSON_TEST=On -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_SHARED_LIBS=Off (生成bin) make sudo make install (安裝libcjson.so) |
參考文檔:《使用 CJSON 在C語言中進行 JSON 的創建和解析的實例講解》、《cJSON學習筆記》。
下面是一個構造JSON數據,然后解析,打印Type-Key-Value的小示例:
#include <stdio.h> void printJson(cJSON *root) static char * makeJson(void) pJsonRoot = cJSON_CreateObject(); p = cJSON_Print(pJsonRoot); cJSON_Delete(pJsonRoot); return p;
if(NULL == pMsg) pJson = cJSON_Parse(pMsg); pSub = cJSON_GetObjectItem(pJson, "hello"); pSub = cJSON_GetObjectItem(pJson, "number"); pSub = cJSON_GetObjectItem(pJson, "bool"); pSub = cJSON_GetObjectItem(pJson, "subobj"); pSubSub = cJSON_GetObjectItem(pSub, "subjsonobj"); cJSON_Delete(pJson); int main(void) /* print the version */ p = makeJson(); 構造JSON數據 |
在安裝(sudo make install)cJSON之后,編譯的時候需要跟上libcjson庫文件:
gcc demo.c -o demo -lcjson |
執行結果如下:
Version: 1.3.2 Type=0x10, hello="hello world" |
json-c
參考文檔:《JSON C庫的使用》
下載代碼:
git clone https://github.com/arnoldlu/json-c.git |
編譯安裝:
sh autogen.sh ./configure make make install |