在C語(yǔ)言中,返回JSON數(shù)據(jù)類型是一種非常普遍的需求。通常我們會(huì)使用一些開(kāi)源的庫(kù)來(lái)幫助我們輕松實(shí)現(xiàn)這個(gè)功能,比如 cJSON 和 jsmn。
在使用 cJSON 庫(kù)返回 JSON 數(shù)據(jù)時(shí),我們首先需要?jiǎng)?chuàng)建一個(gè) JSON 對(duì)象,然后將需要返回的數(shù)據(jù)添加到這個(gè)對(duì)象中。比如以下代碼段:
cJSON *root = cJSON_CreateObject(); cJSON_AddStringToObject(root, "name", "Tom"); cJSON_AddNumberToObject(root, "age", 20); char *json_str = cJSON_Print(root);
這段代碼首先創(chuàng)建了一個(gè) cJSON 對(duì)象 root,然后使用 cJSON_AddStringToObject 和 cJSON_AddNumberToObject 分別將名字和年齡添加到這個(gè)對(duì)象中。最后,使用 cJSON_Print 將這個(gè)對(duì)象轉(zhuǎn)換成 JSON 字符串。
在使用 jsmn 庫(kù)返回 JSON 數(shù)據(jù)時(shí),我們需要首先解析接收到的 JSON 字符串,然后根據(jù)需要提取數(shù)據(jù)并構(gòu)造出需要返回的 JSON 對(duì)象。以下是一個(gè)例子:
jsmn_parser parser; jsmntok_t tokens[128]; jsmn_init(&parser); int num_tokens = jsmn_parse(&parser, json_str, strlen(json_str), tokens, 128); for (int i = 0; i< num_tokens; ++i) { if (tokens[i].type == JSMN_OBJECT) { int start = tokens[i].start; int end = tokens[i].end; for (int j = i + 1; j< num_tokens; ++j) { if (tokens[j].parent == i) { char *key = (char *)malloc(tokens[j].end - tokens[j].start + 1); strncpy(key, json_str + tokens[j].start, tokens[j].end - tokens[j].start); key[tokens[j].end - tokens[j].start] = '\0'; cJSON_AddStringToObject(root, key, ""); free(key); } } } }
這段代碼首先使用 jsmn_parse 將接收到的 JSON 字符串解析成一些 token,然后遍歷這些 token,提取出需要的數(shù)據(jù)并構(gòu)造出 JSON 對(duì)象。這個(gè)例子中,我們遍歷了全部的 token,找到了對(duì)象類型的 token,然后再遍歷這個(gè)對(duì)象內(nèi)部的 token,找到對(duì)應(yīng)的鍵,最后使用 cJSON_AddStringToObject 將鍵和一個(gè)空字符串添加到 cJSON 對(duì)象中。