• 使用cjson进行对象的嵌套封装


    共分两个部分,1)创建json、2)解析json

    1)创建嵌套json的代码

    char * makeJson()
    {
        cJSON * pRoot = NULL;
        cJSON * pSub_1 = NULL;
        cJSON * pSub_2 = NULL;
    
        if((pRoot = cJSON_CreateObject()) == NULL)
        {
            return NULL;
        }
        if((pSub_1 = cJSON_CreateObject()) == NULL)
        {
            return NULL;
        }
        if((pSub_2 = cJSON_CreateObject()) == NULL)
        {
            return NULL;
        }
        cJSON_AddStringToObject(pSub_2, "cStr", "ccccccc");
    
        cJSON_AddStringToObject(pSub_1, "bStr", "bbbbbbb");
        cJSON_AddItemToObject(pSub_1, "subobject_2", pSub_2);
    
        cJSON_AddStringToObject(pRoot, "aStr", "aaaaaaa");
        cJSON_AddItemToObject(pRoot, "subobject_1", pSub_1);
        cJSON_AddStringToObject(pRoot, "xStr", "xxxxxxx");
    
        //cJSON_PrintUnformatted : make json string for Unformatted
        //char * pJson = cJSON_PrintUnformatted(pRoot);
    
        char * pJson = cJSON_Print(pRoot);
        if(NULL == pJson)
        {
            cJSON_Delete(pRoot);
            return NULL;
        }
        return pJson;
    }

    2)解析json的代码

    int parseJson(const char * pJson)
    {
        if(NULL == pJson)
        {
            return 1;
        }
        cJSON * pRoot = cJSON_Parse(pJson);
        if(NULL == pRoot)
        {
            return 2;
        }
        cJSON * pSub_1 = cJSON_GetObjectItem(pRoot, "aStr");
        if(NULL == pSub_1)
        {
            cJSON_Delete(pRoot);
            return 3;
        }
        printf("get aStr : [%s]
    ", pSub_1->valuestring);
        pSub_1 = cJSON_GetObjectItem(pRoot, "xStr");
        if(NULL == pSub_1)
        {
            cJSON_Delete(pRoot);
            return 4;
        }
        printf("get xStr : [%s]
    ", pSub_1->valuestring);
        pSub_1 = cJSON_GetObjectItem(pRoot, "subobject_1");
        if(NULL == pSub_1)
        {
            cJSON_Delete(pRoot);
            return 5;
        }
        printf("get Sub Obj 1
    ");
        cJSON * pSub_2 = cJSON_GetObjectItem(pSub_1, "bStr");
        if(NULL == pSub_2)
        {
            cJSON_Delete(pRoot);
            return 6;
        }
        printf("get bStr : [%s]
    ", pSub_2->valuestring);
        pSub_2 = cJSON_GetObjectItem(pSub_1, "subobject_2");
        if(NULL == pSub_2)
        {
            cJSON_Delete(pRoot);
            return 7;
        }
        printf("get Obj 2
    ");
        cJSON * pStr = cJSON_GetObjectItem(pSub_2, "cStr");
        if(NULL == pStr)
        {
            cJSON_Delete(pRoot);
            return 8;
        }
        printf("get cStr : [%s]
    ", pStr->valuestring);
    
        cJSON_Delete(pRoot);
        return 0;
    }

    3)主函数

    int main()
    {
        char * pJson = makeJson();
        printf("JSON:
    %s
    ", pJson);
        parseJson(pJson);
        free(pJson);
    
        return 0;
    }

    完整的代码请打开下面的代码或到百度网盘下载 http://pan.baidu.com/s/1pJ7KZSR

    #include <stdio.h>
    #include "cJSON.h"
    
    char * makeJson()
    {
        cJSON * pRoot = NULL;
        cJSON * pSub_1 = NULL;
        cJSON * pSub_2 = NULL;
    
        if((pRoot = cJSON_CreateObject()) == NULL)
        {
            return NULL;
        }
        if((pSub_1 = cJSON_CreateObject()) == NULL)
        {
            return NULL;
        }
        if((pSub_2 = cJSON_CreateObject()) == NULL)
        {
            return NULL;
        }
        cJSON_AddStringToObject(pSub_2, "cStr", "ccccccc");
    
        cJSON_AddStringToObject(pSub_1, "bStr", "bbbbbbb");
        cJSON_AddItemToObject(pSub_1, "subobject_2", pSub_2);
    
        cJSON_AddStringToObject(pRoot, "aStr", "aaaaaaa");
        cJSON_AddItemToObject(pRoot, "subobject_1", pSub_1);
        cJSON_AddStringToObject(pRoot, "xStr", "xxxxxxx");
    
        //cJSON_PrintUnformatted : make json string for Unformatted
        //char * pJson = cJSON_PrintUnformatted(pRoot);
    
        char * pJson = cJSON_Print(pRoot);
        if(NULL == pJson)
        {
            cJSON_Delete(pRoot);
            return NULL;
        }
        return pJson;
    }
    
    int parseJson(const char * pJson)
    {
        if(NULL == pJson)
        {
            return 1;
        }
        cJSON * pRoot = cJSON_Parse(pJson);
        if(NULL == pRoot)
        {
            return 2;
        }
        cJSON * pSub_1 = cJSON_GetObjectItem(pRoot, "aStr");
        if(NULL == pSub_1)
        {
            cJSON_Delete(pRoot);
            return 3;
        }
        printf("get aStr : [%s]
    ", pSub_1->valuestring);
        pSub_1 = cJSON_GetObjectItem(pRoot, "xStr");
        if(NULL == pSub_1)
        {
            cJSON_Delete(pRoot);
            return 4;
        }
        printf("get xStr : [%s]
    ", pSub_1->valuestring);
        pSub_1 = cJSON_GetObjectItem(pRoot, "subobject_1");
        if(NULL == pSub_1)
        {
            cJSON_Delete(pRoot);
            return 5;
        }
        printf("get Sub Obj 1
    ");
        cJSON * pSub_2 = cJSON_GetObjectItem(pSub_1, "bStr");
        if(NULL == pSub_2)
        {
            cJSON_Delete(pRoot);
            return 6;
        }
        printf("get bStr : [%s]
    ", pSub_2->valuestring);
        pSub_2 = cJSON_GetObjectItem(pSub_1, "subobject_2");
        if(NULL == pSub_2)
        {
            cJSON_Delete(pRoot);
            return 7;
        }
        printf("get Obj 2
    ");
        cJSON * pStr = cJSON_GetObjectItem(pSub_2, "cStr");
        if(NULL == pStr)
        {
            cJSON_Delete(pRoot);
            return 8;
        }
        printf("get cStr : [%s]
    ", pStr->valuestring);
    
        cJSON_Delete(pRoot);
        return 0;
    }
    
    int main()
    {
        char * pJson = makeJson();
        printf("JSON:
    %s
    ", pJson);
        parseJson(pJson);
        free(pJson);
    
        return 0;
    }
    View Code

    编译

    $ gcc -o nestcjson nestcjson.c cjson.c -lm

    :编译时链接的库 -lm 是数学库,不加此库时 gcc 返回错误,错误代码如下

    $ gcc -o nestcjson nestcjson.c cjson.c 
    /tmp/ccugp95L.o: In function `parse_number':
    cjson.c:(.text+0x402): undefined reference to `pow'
    /tmp/ccugp95L.o: In function `print_number':
    cjson.c:(.text+0x512): undefined reference to `floor'
    collect2: ld 返回 1

    运行

    $ ./nestcjson 
    JSON:
    {
        "aStr":    "aaaaaaa",
        "subobject_1":    {
            "bStr":    "bbbbbbb",
            "subobject_2":    {
                "cStr":    "ccccccc"
            }
        },
        "xStr":    "xxxxxxx"
    }
    get aStr : [aaaaaaa]
    get xStr : [xxxxxxx]
    get Sub Obj 1
    get bStr : [bbbbbbb]
    get Obj 2
    get cStr : [ccccccc]

    作者:风波

    mail : fengbohello@qq.com

  • 相关阅读:
    bind智能DNS + bindUI管理系统(mysql + bind dlz)
    什么情况下,英文单词中的k发音变g,t发音变d,p发音变b
    rsyn同步软链接保持不变
    yaml,json,ini这三种格式用来做配置文件优缺点
    自动挡车档位介绍
    "挡位"还是"档位",究竟谁错了
    Gitlab备份与恢复、迁移与升级
    树的名称大全
    手动档正确换档手势
    gitlab HA集群
  • 原文地址:https://www.cnblogs.com/fengbohello/p/4363007.html
Copyright © 2020-2023  润新知