今天我們來討論一下C語言下的JSON解析庫,主要比較以下三種庫:
- cJSON
- Jansson
- JSMN
首先我們來看一下cJSON。
#include "cJSON.h" ... cJSON *root = cJSON_Parse(json_str); if (root) { cJSON *item = cJSON_GetObjectItem(root,"item"); //doing something with item cJSON_Delete(root); }
使用上述代碼對JSON進行解析,其中json_str為要解析的JSON字符串,解析后返回的是一個cJSON對象,可以通過cJSON_GetObjectItem()函數獲取其中的元素,返回的也是cJSON類型,最后需要刪除cJSON對象。
接下來是Jansson的使用。
#include "jansson.h" ... json_error_t error; json_t *root = json_loads(json_str, 0, &error); if (root) { json_t *item = json_object_get(root,"item"); //doing something with item json_decref(root); }
與cJSON類似,使用上述代碼對JSON進行解析,其中json_str為要解析的JSON字符串,解析后返回的是一個json_t對象,可以通過json_object_get()函數獲取其中的元素,最后需要釋放json_t對象。
最后是JSMN。
#define JSMN_HEADER #include "jsmn.h" ... jsmn_parser parser; jsmn_init(&parser); int size = 256; jsmntok_t *token = malloc(sizeof(jsmntok_t) * size); if (!token) { return 1; } int r = jsmn_parse(&parser, JSON_STRING, JSON_STRING_LEN, token, size); if (r< 0) { return 1; } int objectIndex = -1; for (int i = 0; i< r; i++) { if (token[i].type == JSMN_OBJECT) { objectIndex = i + 1; } else if (objectIndex >= 0 && token[i].type == JSMN_STRING && jsmn_strcmp(JSON_STRING, &token[i], "item") == 0) { //doing something with data break; } } free(token);
使用JSMN時需要手動指定緩存大小,同時需要手動解析JSON字符串,比較繁瑣,但是效率相對較高。
綜上,cJSON在使用上比較簡單、方便,但是效率相對較低,Jansson在使用上稍微繁瑣一些,但是效率比cJSON高,JSMN相對來說使用上比較繁瑣,但是效率最高,具體選擇哪種解析庫需要根據實際情況來判斷。