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

假设我们有一个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
    }

大功告成!

时间: 2024-10-12 08:30:40

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

excel在不改变格式的情况下,对两个名字的某几个日期下的内容进行替换

1 #-*- coding: UTF-8 -*- 2 import xlrd 3 import sys 4 import locale 5 import os 6 import xlwt 7 from xlutils.copy import copy 8 9 reload(sys) 10 sys.setdefaultencoding( "utf-8" ) 11 homedir=os.getcwd() 12 print u"文件路径",homedir 13 print

Selenium&#160;WebDriver在不知道元素个数的情况下,完成页面所有元素的遍历

以一个选择企业页面为例,假设事先并不知道用户登录后会有几个企业供选择,但是case又需要遍历各个企业,保证各个企业均可正常被访问,那么就可以用红色标记的方式处理. public class ChooseEnterprise {private WebDriver driver;private String baseUrl;private StringBuffer verificationErrors = new StringBuffer(); @Beforepublic void setUp() 

iOS开发之JSON格式数据的生成与解析

本文将从四个方面对IOS开发中JSON格式数据的生成与解析进行讲解: 一.JSON是什么? 二.我们为什么要用JSON格式的数据? 三.如何生成JSON格式的数据? 四.如何解析JSON格式的数据?  JSON格式取代了xml给网络传输带来了很大的便利,但是却没有了xml的一目了然,尤其是json数据很长的时候,我们会陷入繁琐复杂的数据节点查找中.这时我们就需要一款在线校验工具 BeJson. 一.JSON是什么? JSON(JavaScript Object Notation) 是一种轻量级的

ajax发送json格式数据

前后端在做数据交互的时候 一定一定要表明你所发的的数据到底是什么格式 前段后交互 你不能骗人家,不然后端开发人员来找你的时候会抄着一根凳子腿. 你的数据时什么格式 你就应该准确无误告诉别人是什么格式 那么怎么告诉后端你要发送的数据的格式是什么呢 form 表单是通过 他的 enctype 而 ajax 是通过 contentType,如果你要传送的数据是json(通常只有json格式) 你需要这么写 contentType:'application/json' 要怎样发送一个json格式的数据呢

不知道帐号密码的情况下完全重装Mac Min的OS X10.7系统

现状: 1.原系统OS X 10.7 2.老账号不知道密码 3.Mac小盒子 目的: 1.删除老账号 2.更新系统到10.9以上 尝试过程1: 1.按住option键 + 开机 2.选择“磁盘工具” 3.选择当前系统磁盘 4.选择“抹掉”整个磁盘(因为之前系统没什么东西) 5.弹出错误“磁盘抹掉失败:未能卸载磁盘”(因为当前在修复模式,需要使用优盘或者光盘进入修复模式才行) 尝试过程2:(从1.2开始) 1.选择当前系统磁盘的分区 2.“抹掉”:(则所有数据和系统都没了,此时可以重新安装全新系统

把cookie以json形式返回,用js来set cookie.(解决手机浏览器未知情况下获取不到cookie)

1.继上一篇随笔,链接点我,解决手机端cookie的问题. 2.上次用cookie+redis实现了session,并且手机浏览器可能回传cookies有问题,所以最后用js取出cookie跟在请求的url后面. 3.但是今天发现了新的问题,js取cookie存的sessionId为空,情况如下: (1)QQ浏览器能获取某些cookie,另一些cookie获取为空,猜测是后台Response SetCookie的时候,手机端浏览器没能良好的接受. (2)UC浏览器测试正常. (3)Safari情

SpringMVC环境下实现的Ajax异步请求(JSON格式数据)

一 环境搭建 首先是常规的spring mvc环境搭建,不用多说,需要注意的是,这里需要引入jackson相关jar包,然后在spring配置文件"springmvc-servlet.xml"中添加json解析相关配置,我这里的完整代码如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schem

在VS2013下编译json-c库,并简单生成json格式数据

#include "stdafx.h"#include "json-c/json.h" int _tmain(int argc, _TCHAR* argv[]){ // 正常的json格式 json_object *json = json_object_new_object(); json_object_object_add(json, "name", json_object_new_string("laomeng")); j

python 在unix下json格式显示结果

在使用命令号输出接口测试结果,发现无法按照期望的json格式进行显示.查阅资料发现python自带强大的工具. 直接上代码: import os,requests url = XXXXXX content = requests.get(url).text command = "echo '%s' | python -m json.tool" % content print os.system(command) 完美的输出json格式的结果,以后再也不用复制结果到在线json转换工具上了