cJSON简析

news2024/11/21 0:32:02

文章目录

    • json概要
    • cJSON数据结构
  • 递归解析
  • 示例
    • references

json概要

json是一种文本格式的协议
对于人的可阅读性非常好

在这里插入图片描述
其中object和array中的value都可以嵌套

cJSON数据结构

每个节点的数据结构如下

/* cJSON Types: */
#define cJSON_Invalid (0)
#define cJSON_False  (1 << 0)
#define cJSON_True   (1 << 1)
#define cJSON_NULL   (1 << 2)
#define cJSON_Number (1 << 3)
#define cJSON_String (1 << 4)
#define cJSON_Array  (1 << 5)
#define cJSON_Object (1 << 6)
#define cJSON_Raw    (1 << 7) /* raw json */

#define cJSON_IsReference 256
#define cJSON_StringIsConst 512

/* The cJSON structure: */
typedef struct cJSON
{
    /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
    struct cJSON *next;
    struct cJSON *prev;
    /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
    struct cJSON *child;

    /* The type of the item, as above. */
    int type;

    /* The item's string, if type==cJSON_String  and type == cJSON_Raw */
    char *valuestring;
    /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
    int valueint;
    /* The item's number, if type==cJSON_Number */
    double valuedouble;

    /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
    char *string;
} cJSON;

递归解析

入口函数:
cJSON_ParseWithLengthOpts(...)
{
	parse_value(...) // 解析值
}
parse_value(...)
{
	if(...) { ->type = cJSON_NULL; return true; }
	if(...) { ->type = cJSON_False; return true; }
	if(...) { ->type = cJSON_True; return true; }
	if(...) { return parse_string(...); }
	if(...) { return parse_number(...); }
	if(...) { return parse_array(...); }
	if(...) { return parse_object(...); }
	
}
parse_string(...)
{
	...
}
parse_number(...)
{
	...
}
parse_array(...)
{
	do {
		...
		parse_value(...);
		...
    } while(... && x==',');
	...
}
parse_object(...)
{
	do {
		...
		cJSON *new_item = cJSON_New_Item();
		current_item->next = new_item;
        new_item->prev = current_item;
        current_item = new_item;
        parse_string(current_item, input_buffer);
        current_item->string = current_item->valuestring;
        current_item->valuestring = NULL;
		parse_value(...);
		...
    } while(... && x==',');
	...
}

示例

{
    "name": "Awesome 4K",
    "resolutions": [
        {
            "width": 1280,
            "height": 720
        },
        {
            "width": 1920,
            "height": 1080
        },
        {
            "width": 3840,
            "height": 2160
        }
    ]
}

对应的树状结构:
在这里插入图片描述

node1:

struct cJSON *next = 0
struct cJSON *prev = 0
struct cJSON *child = node2
int type = cJSON_Object
char *valuestring = 0
int valueint = 0
double valuedouble = 0
char *string = 0

node2:

struct cJSON *next = node3
struct cJSON *prev = 0
struct cJSON *child = 0
int type = cJSON_String;
char *valuestring = alloc("Awesome 4K")
int valueint = 0
double valuedouble = 0
char *string = alloc("name")

node3:

struct cJSON *next = 0
struct cJSON *prev = node2
struct cJSON *child = node4
int type = cJSON_Array
char *valuestring = 0
int valueint = 0
double valuedouble = 0
char *string = alloc("resolutions")

node4:

struct cJSON *next = node5
struct cJSON *prev = 0
struct cJSON *child = node7
int type = cJSON_Object
char *valuestring = 0
int valueint = 0
double valuedouble = 0
char *string = 0

node5:

struct cJSON *next = node6
struct cJSON *prev = node4
struct cJSON *child = node9
int type = cJSON_Object
char *valuestring = 0
int valueint = 0
double valuedouble = 0
char *string = 0

node6:

struct cJSON *next = 0
struct cJSON *prev = node5
struct cJSON *child = node11
int type = cJSON_Object
char *valuestring = 0
int valueint = 0
double valuedouble = 0
char *string = 0

node7:

struct cJSON *next = node8
struct cJSON *prev = 0
struct cJSON *child = 0
int type = cJSON_Number
char *valuestring = 0
int valueint = 1280
double valuedouble = 1280
char *string = alloc("width")

node8:

struct cJSON *next = 0
struct cJSON *prev = node7
struct cJSON *child = 0
int type = cJSON_Number
char *valuestring = 0
int valueint = 720
double valuedouble = 720
char *string = alloc("height")

node9:

struct cJSON *next = node10
struct cJSON *prev = 0
struct cJSON *child = 0
int type = cJSON_Number
char *valuestring = 0
int valueint = 1920
double valuedouble = 1920
char *string = alloc("width")

node10:

struct cJSON *next = 0
struct cJSON *prev = node9
struct cJSON *child = 0
int type = cJSON_Number
char *valuestring = 0
int valueint = 1080
double valuedouble = 1080
char *string = alloc("height")

node11:

struct cJSON *next = node12
struct cJSON *prev = 0
struct cJSON *child = 0
int type = cJSON_Number
char *valuestring = 0
int valueint = 3840
double valuedouble = 3840
char *string = alloc("width")

node12:

struct cJSON *next = 0
struct cJSON *prev = node11
struct cJSON *child = 0
int type = cJSON_Number
char *valuestring = 0
int valueint = 2160
double valuedouble = 2160
char *string = alloc("height")

references

https://github.com/DaveGamble/cJSON/tree/master

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1337594.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能监测/检测系统EasyCVR国标接入无法播放是什么原因?该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

减小PAPR——DFT扩频

文章目录 前言一、DFT 扩频原理二、MATLAB 仿真1、核心代码2、仿真结果①、4QAM 调制时 IFDMA、LFDMA 和 OFDMA 的 DFT 扩频技术的 PAPR 性能②、16QAM 调制时 IFDMA、LFDMA 和 OFDMA 的 DFT 扩频技术的 PAPR 性能③、64QAM 调制时 IFDMA、LFDMA 和 OFDMA 的 DFT 扩频技术的 PA…

Javaweb见解

1 web相关的概念 1.1 软件的基本架构 C/S(Client-Server)。比如我们手机上的app QQ软件 飞秋 特点&#xff1a;必须下载特定的客户端程序。服务端升级之后&#xff0c;客户端也需要随着升级。 B/S(Broswer-Server).比如京东网站&#xff0c;腾讯qq官方网站 特点&#xff1…

AR眼镜定制_AR智能硬件方案|显示方案|光学方案

AR眼镜的硬件方案定制是根据客户需求和功能来设计的。从芯片平台选型、主板尺寸大小、内存、电池容量&#xff0c;到实现各项功能的传感器、显示光机模组、摄像头、接口、按键、充电等&#xff0c;再到整机的结构、散热设计&#xff0c;以及双目AR眼镜、单目智能眼镜、全息头盔…

【教学类-42-03】20231225 X-Y 之间加法题判断题3.0(确保错误题有绝对错误的答案)

背景需求&#xff1a; 根据需求&#xff0c;0-5以内的判断是21题正确&#xff0c;21题错误&#xff0c;但由于错误答案是随机数抽取&#xff0c;有可能恰好是正确的&#xff0c;所以会出现每套题目的正确数和错误数不一样的情况 优化思路一&#xff1a; 设置如果错误答案与正…

TypeScript学习(基础篇)

前言 在现代的Web开发生态系统中&#xff0c;JavaScript已经成为一种必备的技术。然而&#xff0c;随着应用的增大&#xff0c;JavaScript的一些限制开始显现&#xff0c;例如缺乏静态类型检查和编译时错误检查。这正是TypeScript发挥作用的地方&#xff0c;TypeScript是一种静…

软件测试自学还是报班好?

如果你学软件测试&#xff0c;是以就业为目的&#xff0c;而且是以高薪就业为目的&#xff0c;那我们就要去反推&#xff0c;为了这个目标&#xff0c;我们要去做什么事情。 为了“将高薪就业为目的&#xff0c;我们要做什么事情”阐述清楚&#xff0c;本文行文结构如下&#x…

接口测试及常用接口测试工具(postman/jmeter)附教程

首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息&#xff0c;别人肯定不会把数据库共享给你&#xff0c;他只能给…

Netty—Reactor线程模型详解

文章目录 前言线程模型基本介绍线程模型分类Reactor线程模型介绍Netty线程模型&#xff1a; 传统阻塞IO的缺点Reactor线程模型单Reactor单线程模式单Reactor多线程模式主从Reactor多线程Reactor 模式小结 Netty 线程模型案例说明&#xff1a;Netty核心组件简介ChannelPipeline与…

条件覆盖和条件组合覆盖测试设计-实验八例题

目录 条件覆盖 判定-条件覆盖 条件组合覆盖 实验内容&#xff1a; 以银行内部转账为实例&#xff0c;针对内部转账业务逻辑代码进行分析&#xff0c;运用条件覆盖和条件组合覆盖进行测试用例设计。 实验过程&#xff1a; 条件覆盖 条件覆盖&#xff08;Condition Cover…

官宣定了!2024年举办4次PMP认证考试,每个季度一次

就在刚刚&#xff0c;2023年12月26日14:05分&#xff0c;PMI和中国国际人才交流基金会通过官微&#xff0c;联合发布了2024年PMI认证考试计划的通知&#xff0c;正式宣告了2024年的PMP考试初步安排。 这个通知发布之后&#xff0c;有一些伙伴问华研荟一些细节问题&#xff0c;…

挑战Python100题(6)

100+ Python challenging programming exercises 6 Question 51 Define a class named American and its subclass NewYorker. Hints: Use class Subclass(ParentClass) to define a subclass. 定义一个名为American的类及其子类NewYorker。 提示:使用class Subclass(Paren…

vue-awesome-swiper轮播组件

安装版本&#xff1a;"swiper": "^6.0.0", 安装版本&#xff1a;"vue-awesome-swiper": "^4.1.1", <div class"swiper_conter"><swiper class"swiper" :options"swiperOption" ref"mySw…

怎么实现Servlet的自动加载

在实际开发时&#xff0c;有时候会希望某些Servlet程序可以在Tomcat启动时随即启动。但在默认情况下&#xff0c;第一次访问servlet的时候&#xff0c;才创建servlet对象。 如果servlet构造函数里面的代码或者init方法里面的代码比较多&#xff0c;就会导致用户第一次访问serv…

浅谈能效管理平台在污水处理厂中的应用

摘要&#xff1a;《“十四五”城镇污水处理及资源化利用发展规划》指出&#xff0c;2021—2025 年合理减缓我国城镇污水收集处理设施发展不平衡不充分的矛盾&#xff0c;系统推动补短板强弱项&#xff0c;全方面提升污水收集处理效能&#xff0c;加速推进污水资源化利用&#x…

溴乙腈,2028年将以4.5%左右的复合年增长率增长

溴乙腈是一种化合物&#xff0c;主要用作合成各种药物、农用化学品和其他特种化学品的中间体。近年来&#xff0c;受医疗保健、农业和化学制造等各种最终用途行业对溴乙腈的需求不断增加的推动&#xff0c;全球溴乙腈市场一直在稳步增长。全球市场分析&#xff1a; 在制药和农业…

【Unity地形】使用地形工具创建场景环境-Terrain

如上图Unity的地形工具可以让我们实现创建复杂、丰富的3D室外环境。 我们创建地形很简单&#xff0c;在层级面板中右键-3Dobject-Terrain 就可以创建一个默认的地形模型&#xff01;这个模型是Unity内置的。 接下来的地形编辑功能全部集中在这个地形的组件上 主要功能如下&…

怎么修复MSVCR110.dll文件?全面解析MSVCR110.dll缺失修复方法

MSVCR110.dll文件缺失问题在Windows操作系统用户中相当普遍&#xff0c;经常导致应用程序启动失败或崩溃。MSVCR110.dll是Microsoft Visual C Redistributable for Visual Studio 2012的一部分&#xff0c;且应用程序通常依赖这个DLL文件来执行C库中的代码。文件的丢失可能源自…

Rabbit加密算法

一、引言 随着信息技术的快速发展&#xff0c;数据安全已成为越来越受到重视的领域。加密算法作为保障数据安全的重要技术手段&#xff0c;在通信、存储等领域得到了广泛应用。Rabbit加密算法作为一种新型的加密算法&#xff0c;凭借其简单易懂的原理、高速的运算性能以及良好…

isEmpty 和 isBlank 的用法区别,居然一半的人答不上来.....

亲爱的小伙伴们&#xff0c;由于微信公众号改版&#xff0c;打乱了发布时间&#xff0c;为了保证大家可以及时收到文章的推送&#xff0c;可以点击上方蓝字关注测试工程师成长之路&#xff0c;并设为星标就可以第一时间收到推送哦&#xff01; 也许你两个都不知道,也许你除了is…