且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

在不知道json格式的情况下如何使用cjson进行解析

更新时间:2022-06-18 07:06:53

假设我们有一个json字符串,但是我们不知道这个json的组织方式,那么如何进行解析呢,下面就给一个小例子。

1、我们的json串如下:

在不知道json格式的情况下如何使用cjson进行解析
{
    "aStr":    "aaaaaaa",
    "subobject_1":    {
        "bStr":    "bbbbbbb",
        "subobject_2":    {
            "cStr":    "ccccccc"
        }
    },
    "xStr":    "xxxxxxx"
}
在不知道json格式的情况下如何使用cjson进行解析

假设我们只知道这是个json串,不知道这个json都有哪些对象,也不知道这些对象的名字和值,那么现在开始进行解析。

2、先用cjson把这个字符串解析成cjson能识别的存储方式:

假设我们这个字符串叫xjson,解析的代码如下:

在不知道json格式的情况下如何使用cjson进行解析
    char * xjson = 
        "{\ 
            \"aStr\": \"aaaaaaa\", \
            \"subobject_1\": \
            { \
                \"bStr\": \"bbbbbbb\", \
                \"subobject_2\": \
                {\
                    \"cStr\": \"ccccccc\"\
                } \
            }, \
            \"xStr\": \"xxxxxxx\" \
        }";
    cJSON * pJson = cJSON_Parse(xjson);
在不知道json格式的情况下如何使用cjson进行解析

先判断xjson是什么类型的,再根据不同的类型进行解析:

在不知道json格式的情况下如何使用cjson进行解析
#include <string.h>
#include <stdio.h>
#include "cJSON.h"

void printntab(int iCnt)
{
    int i = 0;
    for(i = 0; i < iCnt; i++)
    {
        printf("\t");
    }
}

int parseJson(cJSON * pJson, int iCnt)
{
    if(NULL == pJson)
    {
        return -1;
    }
    switch(pJson->type)
    {
        case cJSON_False :
            {
                printf("%s : %d\n", pJson->string, pJson->valueint);
            }
            break;
        case cJSON_True :
            {
                printf("%s : %d\n", pJson->string, pJson->valueint);
            }
            break;
        case cJSON_NULL :
            {
                printf("%s : NULL\n", pJson->string);
            }
            break;
        case cJSON_Number :
            {
                printf("%s : %d | %lf\n", pJson->string, pJson->valueint, pJson->valuedouble);
            }
            break;
        case cJSON_String :
            {
                printf("%s : %s\n", pJson->string, pJson->valuestring);
            }
            break;
        case cJSON_Array  :
        case cJSON_Object :
            {
                int iSize = cJSON_GetArraySize(pJson);
                int i = 0;
                iCnt++;
                printf("%s : {\n", NULL == pJson->string ? "" : pJson->string);
                for(i = 0; i < iSize; i++)
                {
                    printntab(iCnt);
                    cJSON * pSub = cJSON_GetArrayItem(pJson, i);
                    parseJson(pSub, iCnt);
                }
                printntab(iCnt);
                printf("}\n");
            }
            break;
        default :
            return -1;
            break;
    }
}

int main()
{
    char * xjson =
        "{\
            \"aStr\": \"aaaaaaa\", \
            \"subobject_1\": \
            { \
                \"bStr\": \"bbbbbbb\", \
                \"subobject_2\": \
                {\
                    \"cStr\": \"ccccccc\"\
                } \
            }, \
            \"xStr\": \"xxxxxxx\" \
        }";
    cJSON * pJson = cJSON_Parse(xjson);
    if(NULL == pJson)
    {
        return -1;
    }
    parseJson(pJson, 0);
}
在不知道json格式的情况下如何使用cjson进行解析

编译:

在不知道json格式的情况下如何使用cjson进行解析
$ g++ -o main main.cpp cjson.c 
main.cpp: In function ‘int main()’:
main.cpp:73:3: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
在不知道json格式的情况下如何使用cjson进行解析

运行结果:

在不知道json格式的情况下如何使用cjson进行解析
$ ./main 
 : {
    aStr : aaaaaaa
    subobject_1 : {
        bStr : bbbbbbb
        subobject_2 : {
            cStr : ccccccc
            }
        }
    xStr : xxxxxxx
    }
在不知道json格式的情况下如何使用cjson进行解析

大功告成!



本文转自郝峰波博客园博客,原文链接:http://www.cnblogs.com/fengbohello/p/4537436.html,如需转载请自行联系原作者