JSON(JavaScript Object Notation)是一種輕量級數(shù)據(jù)交換格式,廣泛用于前端開發(fā)中許多API的數(shù)據(jù)交互。C語言作為一種底層語言,同樣需要解析JSON數(shù)據(jù)。本文將介紹如何使用C語言解析JSON數(shù)組。
首先,我們需要先了解JSON數(shù)組的結(jié)構(gòu)。JSON數(shù)組由一對中括號“[]”包裹,其中每個(gè)元素用逗號隔開。元素可以是其他的JSON數(shù)據(jù)類型,例如:字符串,數(shù)值等。例如下面的JSON數(shù)組:
[ "apple", "banana", "orange" ]
我們使用C語言中的 jsmn 庫來解析JSON數(shù)組。jsmn 是一個(gè)輕量級的JSON解析器,適用于嵌入式設(shè)備中。
使用 jsmn 庫需要先下載并安裝該庫,然后在代碼中包含 jsmn.h 和 jsmn.c 文件。以下是解析上文的JSON數(shù)組代碼:
#include <stdio.h> #include <string.h> #include <jsmn.h> int main() { // JSON string char *json_string = "[\"apple\",\"banana\",\"orange\"]"; // Create jsmn parser and initialize jsmn_parser parser; jsmn_init(&parser); // Get token count int r; size_t tokens_size = 10; jsmntok_t *tokens = (jsmntok_t*)malloc(sizeof(jsmntok_t) * tokens_size); while ((r = jsmn_parse(&parser, json_string, strlen(json_string), tokens, tokens_size)) == JSMN_ERROR_NOMEM) { // Token count is not enough. tokens_size *= 2; tokens = (jsmntok_t*)realloc(tokens, sizeof(jsmntok_t) * tokens_size); } // Check error if (r == JSMN_ERROR_INVAL) { printf("JSON string is invalid\n"); return 1; } // Check if root is an array if (tokens[0].type != JSMN_ARRAY) { printf("Root element is not an array\n"); return 1; } // Loop through each element of array for (int i = 1; i < tokens_count; i++) { if (tokens[i].type == JSMN_STRING) { printf("%.*s\n", tokens[i].end - tokens[i].start, json_string + tokens[i].start); // print string } } return 0; }
運(yùn)行上述代碼,輸出結(jié)果為:
apple banana orange
代碼解釋: 我們首先讀取JSON字符串,并初始化jsmn解析器。然后計(jì)算元素的數(shù)量,并檢查根元素是否為數(shù)組類型。最后,我們遍歷數(shù)組并打印出每個(gè)元素。
在真實(shí)應(yīng)用中,我們可能需要解析更復(fù)雜的JSON數(shù)據(jù)結(jié)構(gòu),例如 JSON 對象。jsmn 庫提供了更多的API,使解析更加容易,只需簡單的修改上述代碼即可。