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

在不知道json格式的情况下如何使用cjson进行解析转载自:https://www.cnblogs.com/fengbohello/p/4537436.html

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

1、我们的json串如下:

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

1、我们的json串如下:

复制代码
{
    "aStr":    "aaaaaaa",
    "subobject_1":    {
        "bStr":    "bbbbbbb",
        "subobject_2":    {
            "cStr":    "ccccccc"
        }
    },
    "xStr":    "xxxxxxx"
}
复制代码

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

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

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

复制代码
    char * xjson = 
        "{\ 
            \"aStr\": \"aaaaaaa\", \
            \"subobject_1\": \
            { \
                \"bStr\": \"bbbbbbb\", \
                \"subobject_2\": \
                {\
                    \"cStr\": \"ccccccc\"\
                } \
            }, \
            \"xStr\": \"xxxxxxx\" \
        }";
    cJSON * pJson = cJSON_Parse(xjson);
复制代码

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

复制代码
#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);
}
复制代码

编译:

$ 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]

运行结果:

复制代码
$ ./main 
 : {
    aStr : aaaaaaa
    subobject_1 : {
        bStr : bbbbbbb
        subobject_2 : {
            cStr : ccccccc
            }
        }
    xStr : xxxxxxx
    }
复制代码

大功告成!

 




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值