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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介:

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

大功告成!



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


相关文章
|
30天前
|
JSON 小程序 UED
微信小程序 app.json 配置文件解析与应用
本文介绍了微信小程序中 `app.json` 配置文件的详细
138 12
|
30天前
|
JSON 缓存 API
解析电商商品详情API接口系列,json数据示例参考
电商商品详情API接口是电商平台的重要组成部分,提供了商品的详细信息,支持用户进行商品浏览和购买决策。通过合理的API设计和优化,可以提升系统性能和用户体验。希望本文的解析和示例能够为开发者提供参考,帮助构建高效、可靠的电商系统。
39 12
|
1月前
|
JSON 前端开发 搜索推荐
关于商品详情 API 接口 JSON 格式返回数据解析的示例
本文介绍商品详情API接口返回的JSON数据解析。最外层为`product`对象,包含商品基本信息(如id、name、price)、分类信息(category)、图片(images)、属性(attributes)、用户评价(reviews)、库存(stock)和卖家信息(seller)。每个字段详细描述了商品的不同方面,帮助开发者准确提取和展示数据。具体结构和字段含义需结合实际业务需求和API文档理解。
|
2月前
|
人工智能 搜索推荐 API
Cobalt:开源的流媒体下载工具,支持解析和下载全平台的视频、音频和图片,支持多种视频质量和格式,自动提取视频字幕
cobalt 是一款开源的流媒体下载工具,支持全平台视频、音频和图片下载,提供纯净、简洁无广告的体验
360 9
Cobalt:开源的流媒体下载工具,支持解析和下载全平台的视频、音频和图片,支持多种视频质量和格式,自动提取视频字幕
|
1月前
|
自然语言处理 数据处理 索引
mindspeed-llm源码解析(一)preprocess_data
mindspeed-llm是昇腾模型套件代码仓,原来叫"modelLink"。这篇文章带大家阅读一下数据处理脚本preprocess_data.py(基于1.0.0分支),数据处理是模型训练的第一步,经常会用到。
53 0
|
2月前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
2月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
2月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
2月前
|
安全 搜索推荐 数据挖掘
陪玩系统源码开发流程解析,成品陪玩系统源码的优点
我们自主开发的多客陪玩系统源码,整合了市面上主流陪玩APP功能,支持二次开发。该系统适用于线上游戏陪玩、语音视频聊天、心理咨询等场景,提供用户注册管理、陪玩者资料库、预约匹配、实时通讯、支付结算、安全隐私保护、客户服务及数据分析等功能,打造综合性社交平台。随着互联网技术发展,陪玩系统正成为游戏爱好者的新宠,改变游戏体验并带来新的商业模式。
|
2月前
|
PyTorch Shell API
Ascend Extension for PyTorch的源码解析
本文介绍了Ascend对PyTorch代码的适配过程,包括源码下载、编译步骤及常见问题,详细解析了torch-npu编译后的文件结构和三种实现昇腾NPU算子调用的方式:通过torch的register方式、定义算子方式和API重定向映射方式。这对于开发者理解和使用Ascend平台上的PyTorch具有重要指导意义。

推荐镜像

更多