cJSON 解析器开源项目学习笔记

本文是关于cJSON解析器的学习笔记,介绍了JSON的基本概念,解析器的主要组成部分,源码分析,特别是解析JSON数据包的过程。cJSON解析器包含解析和构造两个主要部分,并涉及内存管理。解析过程中,通过cJSON结构体处理不同数据类型,解析函数根据数据类型层层调用,实现了JSON字符串到数据结构的转换。
摘要由CSDN通过智能技术生成

cJSON 解析器开源项目学习笔记

JSON是什么?

这个问题很重要,在各大博客、网站、甚至JSON官网会这样说:

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。

其实你只需要知道它就是一种数据格式,简单易于传输和交换(交换说白了就是容易解析)。
但是我还是推荐看一下CJSON官网的详细介绍:
cJSON英文版
cJSON中文版
我个人觉得大家还是应该坚持看一下英文版的,因为大多说的一手资料都是英文版的,例如大多数github上的开源项目包括其说明文件readme.md都是用英文撰写的,所以如果英文不通的话会非常不适应。

分析项目组成

首先 cJSON 解析器项目在宏观上主要分为两个部分:解析JSON数据包 (cJSON *parse_value(char *my_string))和构造JSON数据包(void create_objects())。
非常重要的辅助部分:内存管理部分( 这是非常重要的也是需要特别注意和小心的部分!)

分析源码的组成

源码的的组成较为简单:cJSON.h 和 cJSON.c 两源码文件,加一个 test.c 测试文件(同时也是主程序所在文件)
文件列表(两源文件加一个头文件)
* test.c
* cJSON.c
* cJSON.h

分析源码的详细工作过程
解析JSON数据包部分

首先我先介绍一下cJSON结构体这对后面的理解至关重要!

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

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

    char *valuestring;          /* The item's string, if type==cJSON_String */
    int valueint;               /* The item's number, if type==cJSON_Number */
    double valuedouble;         /* The item's number, if type==cJSON_Number */

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

从上面可以看出cJSON结构体中含有三个指针:指向子节点的指针cJSON* child
指向前后的指针cJSON* next cJSON* prev
int type代表的是数据类型,有7种,在头文件中被定义,代码如下:

#define cJSON_False  (1 << 0)// 1
#define cJSON_True   (1 << 1)// 2
#define cJSON_NULL   (1 << 2)// 4
#define cJSON_Number (1 << 3)// 8
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值