cJSON用法まとめ

13392 ワード

cJSONは使いやすい軽量級JSON解析器で、JSONを作成したり、C言語で書かれたりして、最新のコードは約700行以上あります.
ダウンロードアドレス
https://github.com/DaveGamble/cJSON https://sourceforge.net/projects/cjson/
コンパイル方式(cJSONライブラリ、全部で2つのファイル:cJSON.c、cJSON.h)
gcc cJSON.c main.c -o main -lm
基本インタフェースの説明
作成されたJSON形式の説明:{}はObjectを表し、[]はArrayを表す
cJSON_CreateObject:JSON構造体cJSON_を作成するAddItemToObject:JSON構造体にitemを追加するcJSON_Print:JSON形式の文字列を通常文字列cJSON_に変換Parse:通常文字列をJSON形式の文字列cJSON_に変換Delete:JSON構造体を解放する
以下のマクロ定義は、JSONノードの作成をより迅速に支援します.
 #define cJSON_AddNullToObject(object,name)     cJSON_AddItemToObject(object, name, cJSON_CreateNull())
 #define cJSON_AddTrueToObject(object,name)     cJSON_AddItemToObject(object, name, cJSON_CreateTrue())
 #define cJSON_AddFalseToObject(object,name)        cJSON_AddItemToObject(object, name, cJSON_CreateFalse())
 #define cJSON_AddBoolToObject(object,name,b)   cJSON_AddItemToObject(object, name, cJSON_CreateBool(b))
 #define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n))
 #define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s))

たとえば、「name」:「Tom」のノードを追加する場合、次の2行のコードは等しいです.
cJSON_AddStringToObject(root, "name", "Tom")
cJSON_AddItemToObject(root, "name", cJSON_CreateString("Tom"))

JSONの作成と解析のdemoについて説明します
JSONの作成方法
demo1
    {
        "name": "Tom",
        "age":  25,
        "marry":        true,
        "child":        null
    }

demo 1のコード実装の作成
char * cjson_create_test1(void)
{
   char * out;
   cJSON *root;

   root = cJSON_CreateObject();
   if(!root)
   {
       printf("cJSON create error!!
"
); return NULL; } cJSON_AddItemToObject(root, "name", cJSON_CreateString("Tom")); cJSON_AddItemToObject(root, "age", cJSON_CreateNumber(25)); cJSON_AddItemToObject(root, "marry", cJSON_CreateBool(1)); cJSON_AddItemToObject(root, "child", cJSON_CreateNull()); out=cJSON_Print(root); cJSON_Delete(root); if(out) { printf("%s
"
, out); return out; } return NULL; }

demo2
{
    "name": "Tom",
    "age":  25,
    "marry":        true,
    "children":     [{
                    "name": "May",
                    "age":  2
            }, {
                    "name": "Kendy",
                    "age":  3
            }, {
                    "name": "Mark",
                    "age":  1
            }]
}

demo 2の実装方法の作成
char * cjson_create_test2(void)
{
    char * out;
    cJSON *root;
    cJSON *child, *child1, *child2, *child3;

    root = cJSON_CreateObject();
    if(!root)
    {
        printf("cJSON create error!!
"
); return NULL; } cJSON_AddItemToObject(root, "name", cJSON_CreateString("Tom")); cJSON_AddItemToObject(root, "age", cJSON_CreateNumber(25)); cJSON_AddItemToObject(root, "marry", cJSON_CreateBool(1)); child = cJSON_CreateArray(); CJSON_CHK_FAIL(child, NULL); cJSON_AddItemToObject(root, "children", child); child1 = cJSON_CreateObject(); CJSON_CHK_FAIL(child1, NULL); cJSON_AddItemToObject(child1, "name", cJSON_CreateString("May")); cJSON_AddItemToObject(child1, "age", cJSON_CreateNumber(2)); child2 = cJSON_CreateObject(); CJSON_CHK_FAIL(child2, NULL); cJSON_AddItemToObject(child2, "name", cJSON_CreateString("Kendy")); cJSON_AddItemToObject(child2, "age", cJSON_CreateNumber(3)); child3 = cJSON_CreateObject(); CJSON_CHK_FAIL(child3, NULL); cJSON_AddItemToObject(child3, "name", cJSON_CreateString("Mark")); cJSON_AddItemToObject(child3, "age", cJSON_CreateNumber(1)); cJSON_AddItemToArray(child, child1); cJSON_AddItemToArray(child, child2); cJSON_AddItemToArray(child, child3); out=cJSON_Print(root); cJSON_Delete(root); if(out) { printf("%s
"
, out); return out; } return NULL; }

JSONの解析方法
上のdemo 1を解析
void cjson_parse_test1(void)
{
    cJSON * root;
    cJSON *name, *age, *marry, *child;

    root = cJSON_Parse(cjson_create_test1());   
    if(!root)
    {
        printf("cJSON_Parse error!!
"
); return; } name = cJSON_GetObjectItem(root, "name"); if(name) { printf("Get name value : %s
"
, name->valuestring); } age = cJSON_GetObjectItem(root, "age"); if(age) { printf("Get age value : %d
"
, age->valueint); } marry = cJSON_GetObjectItem(root, "marry"); if(marry) { printf("Get marry value : %d
"
, marry->valueint); } child = cJSON_GetObjectItem(root, "child"); if(child) { printf("Get child value : %s
"
, marry->valuestring); } cJSON_Delete(root); }

上のdemo 2を解析
void cjson_parse_test2(void)
{
    cJSON * root;
    cJSON *name, *age, *marry, *children;
    cJSON *childNode, *childName, *childAge;

    root = cJSON_Parse(cjson_create_test2());   
    if(!root)
    {
        printf("cJSON_Parse error!!
"
); return; } name = cJSON_GetObjectItem(root, "name"); if(name) { printf("Get name value : %s
"
, name->valuestring); } age = cJSON_GetObjectItem(root, "age"); if(age) { printf("Get age value : %d
"
, age->valueint); } marry = cJSON_GetObjectItem(root, "marry"); if(marry) { printf("Get marry value : %d
"
, marry->valueint); } children = cJSON_GetObjectItem(root, "children"); if(children) { int size = cJSON_GetArraySize(children); printf("Get children size : %d
"
, size); int i = 0; for(i=0; iif(childNode) { childName = cJSON_GetObjectItem(childNode,"name"); if(childName) { printf("Get child name : %s
"
, childName->valuestring); } childAge = cJSON_GetObjectItem(childNode,"age"); if(childAge) { printf("Get child age : %d
"
, childAge->valueint); } } } } cJSON_Delete(root); }

PS:ここでは便利なオンラインJSONフォーマットのチェックとフォーマットのウェブサイトを紹介しますhttp://pro.jsonlint.com/