C語言是一種廣泛用于系統(tǒng)編程的語言,從數(shù)據(jù)的操作性能上講,他非常高效。而json是一種輕量級的數(shù)據(jù)交換格式,更加適用于移動設(shè)備、獲取Web API、RPC等領(lǐng)域。所以,使用C語言序列化JSON就成為了很多開發(fā)者很關(guān)心的一個問題。
C語言沒有現(xiàn)成的json序列化庫,但是可以通過緩沖技巧實(shí)現(xiàn)json序列化。可以定義一個char型數(shù)組,將需要序列化的對象轉(zhuǎn)化為json對象,然后將這個json對象逐一放入到 char型數(shù)組中。最后將char型數(shù)組的內(nèi)容通過網(wǎng)絡(luò)傳輸、保存到文件等方式交流數(shù)據(jù)。
以下是一個簡單的C語言實(shí)現(xiàn)的JSON對象。
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_BUF_LEN 1024 #define JSON_OBJECT_START "{" #define JSON_OBJECT_END "}" #define JSON_ARRAY_START "[" #define JSON_ARRAY_END "]" #define JSON_SEPARATOR "," #define JSON_SEPARATOR_LEN 1 #define JSON_QUOTE "\"" typedef struct { char keyName[20]; char value[20]; } JsonElement; typedef struct { JsonElement elements[5]; } JsonObject; int main(int argc, char *argv[]) { char buf[MAX_BUF_LEN]; JsonObject person; strcpy(person.elements[0].keyName, "name"); strcpy(person.elements[0].value, "Tom"); strcpy(person.elements[1].keyName, "age"); strcpy(person.elements[1].value, "25"); strcpy(person.elements[2].keyName, "sex"); strcpy(person.elements[2].value, "male"); sprintf(buf, JSON_OBJECT_START "\"%s\":%s" JSON_SEPARATOR "\"%s\":%s" JSON_SEPARATOR "\"%s\":%s" JSON_OBJECT_END, person.elements[0].keyName, person.elements[0].value, person.elements[1].keyName, person.elements[1].value, person.elements[2].keyName, person.elements[2].value); printf("%s\n", buf); return 0; }
由于C語言中還沒有bool和null型,需要自己提前定義。通常,我們在序列化時,以true用’1'表示,以false用’0'表示,以null用“”,即空字符串(不要與NULL混淆)表示。
C語言通過字符串緩沖實(shí)現(xiàn)JSON序列化,實(shí)現(xiàn)代碼經(jīng)常凌亂不堪。為了避免每次都自己重寫序列化代碼,可以使用現(xiàn)有的第三方庫來序列化json,比如cJSON、Jansson、JSMN等等,它們可以非常方便地生成和解析json。