JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,常用于前后端數據交互。在C語言中,我們可以使用一些第三方庫來構造JSON數據類型,比如 cJSON 和 jsmn 等。
在使用 cJSON 前,我們需要先下載庫文件,并在代碼中引入頭文件。
#include "cJSON.h"
接下來,我們需要創建一個 cJSON 對象,并向其中添加數據。
cJSON *root = cJSON_CreateObject(); cJSON_AddStringToObject(root, "name", "張三"); cJSON_AddStringToObject(root, "gender", "male"); cJSON_AddNumberToObject(root, "age", 18);
上面的代碼創建了一個名為 root 的 cJSON 對象,并向其中添加了三個鍵值對。我們可以使用不同的 cJSON_AddXXXToObject 函數向 cJSON 對象中添加不同類型的數據。
在添加完數據后,我們可以將 cJSON 對象轉換為 JSON 字符串,以便于傳輸或保存數據。
char *json_str = cJSON_Print(root);
上面的代碼將 root 對象轉換為 JSON 字符串并存儲在 json_str 變量中。需要注意的是,我們需要在使用完 cJSON 對象后手動釋放其占用的內存。
cJSON_Delete(root);
使用 jsmn 構造 JSON 數據類型的方式稍有不同。我們需要先定義一個 jsmntok_t 數組,用于存儲 JSON 字符串中各個節點的信息,然后使用 jsmn_parse 函數解析 JSON 字符串。
char *json_str = "{\"name\": \"張三\", \"gender\": \"male\", \"age\": 18}"; jsmntok_t tokens[128]; jsmn_parser parser; jsmn_init(&parser); // 初始化解析器 int ret = jsmn_parse(&parser, json_str, strlen(json_str), tokens, 128);
上面的代碼從字符串中創建了一個 JSON 對象,并使用 jsmn_parse 函數解析 JSON 字符串,將各個節點的信息存儲在 tokens 數組中。
在解析完成后,我們可以使用 tokens 數組中的信息構造出 JSON 對象。
cJSON *root = cJSON_CreateObject(); for (int i = 0; i< ret; i++) { if (tokens[i].type == JSMN_STRING) { cJSON_AddStringToObject(root, tokens[i].string, tokens[i+1].string); i++; } else if (tokens[i].type == JSMN_PRIMITIVE) { cJSON_AddNumberToObject(root, tokens[i].string, atoi(json_str + tokens[i].start)); } }
上面的代碼遍歷 tokens 數組,如果節點類型為 JSMN_STRING,則將該節點的鍵值對添加到 cJSON 對象中;如果節點類型為 JSMN_PRIMITIVE,則將該節點的數值添加到 cJSON 對象中。
和 cJSON 一樣,使用完 jsmn 后也需要手動釋放其占用的內存。
jsmn_free(tokens);