不可不知的JSON处理库(cJSON)

本文介绍了cJSON,一个适用于ANSI C的轻量级JSON解析器。cJSON易于集成,只需包含头文件和源文件,支持JSON的解析、打包和释放内存。文章详细讲解了cJSON的结构体、数据类型、创建和解析JSON的方法,以及注意事项,如字符串不支持零字符,只支持UTF-8编码,并且存在嵌套深度限制。
摘要由CSDN通过智能技术生成

ANSI C中的超轻量级JSON解析器

JSON(JavaScript对象表示法)是一种轻量级的数据交换格式。人类易于阅读和书写。机器很容易解析和生成。它基于JavaScript编程语言标准ECMA-262第三版(1999年12月)的子集 。JSON是一种完全独立于语言的文本格式,但是使用C语言家族(包括C,C ++,C#,Java,JavaScript,Perl,Python等)的程序员熟悉的约定。这些属性使JSON成为理想的数据交换语言。

cJSON旨在成为您可以完成工作的最简单的解析器。它是资源只有一个C的头文件和C文件,所以方便移植。它可以为你各种需要的json字符串处理,包括打包、解析、修改、删除、添加等。在这里将一探究竟。

在这里将着重叙述json的打包和解析,更多处理玩法,见文章末尾链接。

开始cJSON

cJSON合并到您的项目

因为整个库只有一个C文件和一个头文件,所以您只需复制cJSON.h并复制cJSON.c到项目源并开始使用它。

cJSON用ANSI C(C89)编写,以便支持尽可能多的平台和编译器。

 cJSON.h和cJSON.c点击下载

下载:

https://github.com/DaveGamble/cJSON/releases

Cjson结构体

/* The cJSON structure: */
typedef struct cJSON
{
    struct cJSON *next;
    struct cJSON *prev;
    struct cJSON *child;
    int type;
    char *valuestring;
    int valueint;
    double valuedouble;
    char *string;
} cJSON;

结构体项解析:

next 和prev :Cjson结构体作为一个双向连表的环,可以通过 next 和prev 指针进行连表遍历

child:可以是cJSON_Array、cJSON_Object类型数据

type:当前项的类型

valuestring:内容存储,当类型是cJSON_String和cJSON_Raw

valueint:内容存储,整型,可以是cJSON_False、cJSON_True数据

valuedouble:内容存储,浮点型,当类型是cJSON_Number

string:键名

数据类型

l  cJSON_Invalid表示一个不包含任何值的无效项目。如果将项目设置为全零字节,则将自动具有此类型。

l  cJSON_False表示一个false布尔值。您也可以使用来检查布尔值cJSON_IsBool

l  cJSON_True表示一个true布尔值。您也可以使用来检查布尔值cJSON_IsBool

l  cJSON_NULL表示一个null值

l  cJSON_Number 表示一个数字值。该值存储为double in valuedouble和in valueint。如果数字超出整数范围,INT_MAX或INT_MIN用于valueint

l  cJSON_String表示一个字符串值。它以零终止字符串的形式存储在中valuestring

l  cJSON_Array表示一个数组值。这是通过指向表示数组中值child的cJSON项目的链接列表来实现的。使用next和将元素链接在一起prev,其中第一个元素具有prev.next == NULL和最后一个元素next == NULL

l  cJSON_Object 表示一个对象值。对象的存储方式与数组相同,唯一的区别是对象中的项将其键存储在中string

l  cJSON_Raw表示以JSON字符存储的零终止形式的任何JSON valuestring。例如,可以使用它来避免一遍又一遍地打印相同的静态JSON以节省性能。解析时,cJSON永远不会创建此类型。另请注意,cJSON不会检查其是否为有效JSON。

类型

#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 */

类型判断

cJSON_IsInvalid(const cJSON * const item);
cJSON_IsFalse(const cJSON * const item);
cJSON_IsTrue(const cJSON * const item);
cJSON_IsBool(const cJSON * const item);
cJSON_IsNull(const cJSON * const item);
cJSON_IsNumber(const cJSON * const item);
cJSON_IsString(const cJSON * const item);
cJSON_IsArray(const cJSON * const item);
cJSON_IsObject(const cJSON * const item);
cJSON_IsRaw(const cJSON * const item);

注意

创建cjson对象后,处理完需要进行内存释放:

如果是cjson里的对象,请使用cJSON_Delete()

如果不是对象:cJSON_free()或free()

 

零字符

cJSON不支持包含零字符'\0'或的字符串\u0000。对于当前的API,这是不可能的,因为字符串以零结尾。

 

字符编码

cJSON仅支持UTF-8编码的输入。但是在大多数情况下,它不会拒绝无效的UTF-8作为输入,而只是将其原样传播。只要输入不包含无效的UTF-8,输出将始终是有效的UTF-8。

 </

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值