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)编写,以便支持尽可能多的平台和编译器。
下载:
https://github.com/DaveGamble/cJSON/releases
Cjson结构体
/*@H_301_35@ The cJSON structure: @H_301_35@*/@H_301_35@
typedef @H_301_35@struct@H_301_35@ cJSON
{
@H_301_35@struct@H_301_35@ cJSON *next;
@H_301_35@prev;
@H_301_35@child;
@H_301_35@int@H_301_35@ type;
@H_301_35@char@H_301_35@ *valuestring;
@H_301_35@ valueint;
@H_301_35@double@H_301_35@ valuedouble;
@H_301_35@string@H_301_35@;
} cJSON;@H_301_35@
结构体项解析:
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@H_301_35@ cJSON_Invalid (0)
#define@H_301_35@ cJSON_False (1 << 0)
#define@H_301_35@ cJSON_True (1 << 1)
#define@H_301_35@ cJSON_NULL (1 << 2)
#define@H_301_35@ cJSON_Number (1 << 3)
#define@H_301_35@ cJSON_String (1 << 4)
#define@H_301_35@ cJSON_Array (1 << 5)
#define@H_301_35@ cJSON_Object (1 << 6)
#define@H_301_35@ cJSON_Raw (1 << 7) /* raw json */
类型判断
cJSON_IsInvalid(const@H_301_35@ cJSON * const@H_301_35@ item);
cJSON_IsFalse(@H_301_35@ item);
cJSON_IsTrue(@H_301_35@ item);
cJSON_IsBool(@H_301_35@ item);
cJSON_IsNull(@H_301_35@ item);
cJSON_IsNumber(@H_301_35@ item);
cJSON_IsString(@H_301_35@ item);
cJSON_IsArray(@H_301_35@ item);
cJSON_IsObject(@H_301_35@ item);
cJSON_IsRaw(@H_301_35@const@H_301_35@ item);
注意
创建cjson对象后,处理完需要进行内存释放:
如果是cjson里的对象,请使用cJSON_Delete()
如果不是对象:cJSON_free()或free()
零字符
cJSON不支持包含零字符'\0'或的字符串\u0000。对于当前的API,这是不可能的,因为字符串以零结尾。
字符编码
cJSON仅支持UTF-8编码的输入。但是在大多数情况下,它不会拒绝无效的UTF-8作为输入,而只是将其原样传播。只要输入不包含无效的UTF-8,输出将始终是有效的UTF-8。
C标准
cJSON用ANSI C(或C89,C90)编写。如果您的编译器或C库未遵循此标准,则不能保证正确的行为。
注意:ANSI C不是C ++,因此不应使用C ++编译器进行编译。您可以使用C编译器对其进行编译,然后将其与C ++代码链接。尽管可以使用C ++编译器进行编译,但是不能保证正确的行为。
浮点数字
double除IEEE754双精度浮点数外,cJSON不正式支持任何实现。它可能仍然可以与其他实现一起使用,但是这些实现的错误将被视为无效。
数组和对象的深层嵌套
cJSON不支持嵌套太深的数组和对象,因为这会导致堆栈溢出。为了防止这种CJSON_NESTING_LIMIT情况,默认情况下,cJSON将深度限制为1000,但是可以在编译时进行更改。
格式化输出
1@H_301_35@ #include <stdio.h>
2@H_301_35@ #include "@H_301_35@cJSON.h@H_301_35@"@H_301_35@
3@H_301_35@ #include cJSON.c@H_301_35@ 4@H_301_35@ void@H_301_35@ main(){
@H_301_35@ 5@H_301_35@ //@H_301_35@待解析字符串 @H_301_35@
6@H_301_35@ char@H_301_35@ *json_str={\"key1\":\"dongxiaodong\",\"key2\":1998,\"key3\":55778}@H_301_35@"@H_301_35@;
@H_301_35@ 7@H_301_35@
8@H_301_35@ 输出原字符串@H_301_35@
9@H_301_35@ printf(原字符串:%s\r\n@H_301_35@,json_str);
@H_301_35@10@H_301_35@
11@H_301_35@ 解析成json对象 @H_301_35@
12@H_301_35@ cJSON * json_obj = cJSON_Parse(json_str);
@H_301_35@13@H_301_35@
14@H_301_35@ 格式输出@H_301_35@
15@H_301_35@ char@H_301_35@ *json_print_str=NULL;
@H_301_35@16@H_301_35@ json_print_str=cJSON_Print(json_obj);
@H_301_35@17@H_301_35@ printf(\r\n输出内容:\r\n\r\n%s\r\n@H_301_35@301_35@18@H_301_35@
19@H_301_35@ 释放资源 @H_301_35@
20@H_301_35@ free@H_301_35@(json_print_str);
@H_301_35@21@H_301_35@
22@H_301_35@ 23@H_301_35@ cJSON_Delete(json_obj);
@H_301_35@24@H_301_35@ }
json打包
cJSON_CreateObject函数可创建一个根数据项,在此之后就可以添加各种数据类型的子节点了,使用完成后需要通过cJSON_Delete()释放内存。
创建一层级的json@H_301_35@
代码:
5@H_301_35@ cJSON *root_obj = NULL;根,json对象 @H_301_35@
char@H_301_35@ *out_str = NULL; 输出结果 @H_301_35@
7@H_301_35@ root_obj =cJSON_CreateObject();创建
@H_301_35@ 8@H_301_35@ 添加一个字符串,参数(根对象,键,值) @H_301_35@
9@H_301_35@ cJSON_AddStringToObject(root_obj,key1@H_301_35@"@H_301_35@,1)">dongxiaodong@H_301_35@);
@H_301_35@10@H_301_35@ 添加一个整型,参数(根对象,键,值) @H_301_35@
11@H_301_35@ cJSON_AddNumberToObject(root_obj,1)">key2@H_301_35@1998@H_301_35@12@H_301_35@ 添加一个浮点型,参数(根对象,键,值) @H_301_35@
13@H_301_35@ cJSON_AddNumberToObject(root_obj,1)">key3@H_301_35@22.33@H_301_35@添加一个bool类型,参数(根对象,键,值)
@H_301_35@bool值可以是0/1或false/true @H_301_35@
16@H_301_35@ cJSON_AddBoolToObject(root_obj,1)">key4@H_301_35@0@H_301_35@17@H_301_35@ 将json对象打包成字符串 @H_301_35@
18@H_301_35@ out_str = cJSON_PrintUnformatted(root_obj);
@H_301_35@销毁json对象,释放内存 @H_301_35@
20@H_301_35@ cJSON_Delete(root_obj);
@H_301_35@21@H_301_35@ 输出值:{"key1":"dongxiaodong","key2":1998,"key3":22.33,"key4":false} @H_301_35@
22@H_301_35@ printf(%s@H_301_35@301_35@23@H_301_35@ }
类型创建函数还有:
cJSON_AddNullToObject(cJSON * const object,const char * const name);
cJSON_AddTrueToObject(cJSON * const object,const char * const name);
cJSON_AddFalseToObject(cJSON * const object,const char * const name);
cJSON_AddBoolToObject(cJSON * const object,const char * const name,const cJSON_bool boolean);
cJSON_AddNumberToObject(cJSON * const object,const double number);
cJSON_AddStringToObject(cJSON * const object,const char * const string);
cJSON_AddRawToObject(cJSON * const object,const char * const raw);
cJSON_AddObjectToObject(cJSON * const object,const char * const name);
cJSON_AddArrayToObject(cJSON * const object,const char * const name);
创建多层级的json@H_301_35@
代码:
6@H_301_35@ cJSON *item_obj = NULL;二级json对象 @H_301_35@
7@H_301_35@ 8@H_301_35@
9@H_301_35@ root_obj =cJSON_CreateObject();10@H_301_35@ 11@H_301_35@ cJSON_AddStringToObject(root_obj,1)">14@H_301_35@
创建一个子json对象@H_301_35@
16@H_301_35@ item_obj= cJSON_AddObjectToObject(root_obj,1)">myson@H_301_35@);
@H_301_35@向孩子对象中添加内容@H_301_35@
18@H_301_35@ cJSON_AddStringToObject(item_obj,1)">sonkey1@H_301_35@东小东@H_301_35@19@H_301_35@ cJSON_AddNumberToObject(item_obj,1)">sonkey2@H_301_35@2020@H_301_35@20@H_301_35@
22@H_301_35@ out_str =23@H_301_35@ 24@H_301_35@ 25@H_301_35@ 301_35@
26@H_301_35@ printf(27@H_301_35@ }
创建多层json(数组形式)@H_301_35@
数组对象 @H_301_35@
创建一个子数组对象 @H_301_35@
16@H_301_35@ item_obj= cJSON_AddArrayToObject(root_obj,1)">向数组对象中添加内容@H_301_35@
18@H_301_35@ cJSON_AddItemToArray(item_obj,cJSON_CreateTrue());
@H_301_35@19@H_301_35@ cJSON_AddItemToArray(item_obj,cJSON_CreateNumber(22@H_301_35@));
@H_301_35@301_35@
27@H_301_35@ }
创建的对象还可以是下面这些
cJSON_CreateNull(void);
cJSON_CreateTrue(void);
cJSON_CreateFalse(void);
cJSON_CreateBool(cJSON_bool boolean);
cJSON_CreateNumber(double num);
cJSON_CreateString(const char *string);
cJSON_CreateRaw(const char *raw);
cJSON_CreateArray(void);
cJSON_CreateObject(void);
创建混合json@H_301_35@
6@H_301_35@ cJSON *son_obj=NULL;
@H_301_35@ 7@H_301_35@ cJSON *item_obj = NULL;输出结果
@H_301_35@ 9@H_301_35@
根对象 @H_301_35@
11@H_301_35@ root_obj =cJSON_CreateObject();13@H_301_35@ cJSON_AddStringToObject(root_obj,1)">15@H_301_35@ cJSON_AddNumberToObject(root_obj,1)">16@H_301_35@
18@H_301_35@ item_obj= cJSON_AddArrayToObject(root_obj,1)">21@H_301_35@ cJSON_AddItemToArray(item_obj,1)">22@H_301_35@
子对象 @H_301_35@
24@H_301_35@ son_obj =cJSON_CreateObject();26@H_301_35@ cJSON_AddStringToObject(son_obj,1)">son1@H_301_35@27@H_301_35@ 28@H_301_35@ cJSON_AddNumberToObject(son_obj,1)">son2@H_301_35@29@H_301_35@ 301_35@30@H_301_35@
31@H_301_35@ 32@H_301_35@ out_str =33@H_301_35@ 34@H_301_35@ 35@H_301_35@ 301_35@
36@H_301_35@ printf(37@H_301_35@ }
json解析
解析一层级的json@H_301_35@
代码:
301_35@ 8@H_301_35@ cJSON * json_obj =项存储 @H_301_35@
11@H_301_35@ cJSON *item=12@H_301_35@
13@H_301_35@ 14@H_301_35@ printf(15@H_301_35@
16@H_301_35@ 获取string类型 @H_301_35@
17@H_301_35@ item=cJSON_GetObjectItem(json_obj,1)">);
@H_301_35@18@H_301_35@ printf(\r\nkey1:%s\r\n@H_301_35@valuestring);
@H_301_35@19@H_301_35@ cJSON_Delete(item);释放资源
@H_301_35@20@H_301_35@
获取数字 @H_301_35@
22@H_301_35@ item=cJSON_GetObjectItem(json_obj,1)">23@H_301_35@ printf(\r\nkey2:%d\r\n@H_301_35@valueint);
@H_301_35@24@H_301_35@ cJSON_Delete(item);25@H_301_35@
26@H_301_35@ 27@H_301_35@ item=cJSON_GetObjectItem(json_obj,1)">28@H_301_35@ printf(\r\nkey3:%f\r\n@H_301_35@valuedouble);
@H_301_35@29@H_301_35@ cJSON_Delete(item);获取bool @H_301_35@
32@H_301_35@ item=cJSON_GetObjectItem(json_obj,1)">33@H_301_35@ printf(\r\nkey4:%d\r\n@H_301_35@34@H_301_35@ cJSON_Delete(item);35@H_301_35@
36@H_301_35@ 是否资源 @H_301_35@
37@H_301_35@ 38@H_301_35@ }
解析多层级的json@H_301_35@
301_35@内部项存储@H_301_35@
13@H_301_35@ cJSON * item_item=16@H_301_35@ printf(17@H_301_35@
18@H_301_35@ 19@H_301_35@ item=cJSON_GetObjectItem(json_obj,1)">20@H_301_35@ printf(21@H_301_35@ cJSON_Delete(item);22@H_301_35@
24@H_301_35@ item=cJSON_GetObjectItem(json_obj,1)">25@H_301_35@ printf(26@H_301_35@ cJSON_Delete(item);27@H_301_35@
28@H_301_35@ 子串@H_301_35@
29@H_301_35@ item=cJSON_GetObjectItem(json_obj,1)">30@H_301_35@ item_item=cJSON_GetObjectItem(item,1)">31@H_301_35@ printf(\r\nmyson(sonkey1):%s\r\n@H_301_35@32@H_301_35@ cJSON_Delete(item_item);33@H_301_35@
34@H_301_35@ item_item=cJSON_GetObjectItem(item,1)">35@H_301_35@ printf(\r\nmyson(sonkey2):%d\r\n@H_301_35@36@H_301_35@ cJSON_Delete(item_item);37@H_301_35@
38@H_301_35@ cJSON_Delete(item);39@H_301_35@
40@H_301_35@ 41@H_301_35@ 42@H_301_35@ }
解析多层json(数组形式)@H_301_35@
301_35@获取子串 @H_301_35@
输出数组大小 @H_301_35@
32@H_301_35@ printf(\r\n数组大小:%d\r\n@H_301_35@301_35@34@H_301_35@ 输出项1内容 @H_301_35@
35@H_301_35@ item_item=cJSON_GetArrayItem(item,1)">\r\nmyson(0):%d\r\n@H_301_35@37@H_301_35@ cJSON_Delete(item_item);@H_301_35@38@H_301_35@
39@H_301_35@ 输出项2内容 @H_301_35@
40@H_301_35@ item_item=cJSON_GetArrayItem(item,1)">1@H_301_35@41@H_301_35@ printf(\r\nmyson(1):%d\r\n@H_301_35@42@H_301_35@ cJSON_Delete(item_item);43@H_301_35@
44@H_301_35@ cJSON_Delete(item);45@H_301_35@
46@H_301_35@ 47@H_301_35@ 48@H_301_35@ }
解析混合json@H_301_35@
@H_301_35@
301_35@44@H_301_35@ 项3内容@H_301_35@
45@H_301_35@ item_item=cJSON_GetArrayItem(item,1)">2@H_301_35@46@H_301_35@ cJSON *item_item_son=47@H_301_35@
48@H_301_35@ item_item_son =cJSON_GetObjectItem(item_item,1)">49@H_301_35@ printf(\r\nmyson(2)(son1):%s\r\n@H_301_35@50@H_301_35@ cJSON_Delete(item_item_son);51@H_301_35@
52@H_301_35@ item_item_son =cJSON_GetObjectItem(item_item,1)">53@H_301_35@ printf(\r\nmyson(2)(son2):%d\r\n@H_301_35@54@H_301_35@ cJSON_Delete(item_item_son);释放资源@H_301_35@
55@H_301_35@ cJSON_Delete(item_item);释放资源 @H_301_35@
56@H_301_35@
57@H_301_35@ cJSON_Delete(item);58@H_301_35@
59@H_301_35@ 60@H_301_35@ 61@H_301_35@ }
附件:
cJSON.h
1@H_301_35@ /*@H_301_35@
2@H_301_35@ Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
@H_301_35@ 3@H_301_35@
4@H_301_35@ Permission is hereby granted,free of charge,to any person obtaining a copy
@H_301_35@ 5@H_301_35@ of this software and associated documentation files (the "Software"),to deal
@H_301_35@ 6@H_301_35@ in the Software without restriction,including without limitation the rights
@H_301_35@ 7@H_301_35@ to use,copy,modify,merge,publish,distribute,sublicense,and/or sell
@H_301_35@ 8@H_301_35@ copies of the Software,and to permit persons to whom the Software is
@H_301_35@ 9@H_301_35@ furnished to do so,subject to the following conditions:
@H_301_35@ 10@H_301_35@
11@H_301_35@ The above copyright notice and this permission notice shall be included in
@H_301_35@ 12@H_301_35@ all copies or substantial portions of the Software.
@H_301_35@ 13@H_301_35@
14@H_301_35@ THE SOFTWARE IS PROVIDED "AS IS",WITHOUT WARRANTY OF ANY KIND,EXPRESS OR
@H_301_35@ 15@H_301_35@ IMPLIED,INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,@H_301_35@ 16@H_301_35@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@H_301_35@ 17@H_301_35@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,DAMAGES OR OTHER
@H_301_35@ 18@H_301_35@ LIABILITY,WHETHER IN AN ACTION OF CONTRACT,TORT OR OTHERWISE,ARISING FROM,1)"> 19@H_301_35@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
@H_301_35@ 20@H_301_35@ THE SOFTWARE.
@H_301_35@ 21@H_301_35@ */@H_301_35@
22@H_301_35@
23@H_301_35@ #ifndef cJSON__h
@H_301_35@ 24@H_301_35@ #define@H_301_35@ cJSON__h
25@H_301_35@
26@H_301_35@ #ifdef __cplusplus
@H_301_35@ 27@H_301_35@ extern@H_301_35@ C@H_301_35@ 28@H_301_35@ {
@H_301_35@ 29@H_301_35@ #endif@H_301_35@
30@H_301_35@
31@H_301_35@ #if@H_301_35@ !defined(__WINDOWS__) && (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32))
32@H_301_35@ #define@H_301_35@ __WINDOWS__
33@H_301_35@ 34@H_301_35@
35@H_301_35@ #ifdef __WINDOWS__
@H_301_35@ 36@H_301_35@
37@H_301_35@ When compiling for windows,we specify a specific calling convention to avoid issues where we are being called from a project with a different default calling convention. For windows you have 3 define options:
@H_301_35@ 38@H_301_35@
39@H_301_35@ CJSON_HIDE_SYMBOLS - Define this in the case where you don't want to ever dllexport symbols
@H_301_35@ 40@H_301_35@ CJSON_EXPORT_SYMBOLS - Define this on library build when you want to dllexport symbols (default)
@H_301_35@ 41@H_301_35@ CJSON_IMPORT_SYMBOLS - Define this if you want to dllimport symbol
@H_301_35@ 42@H_301_35@
43@H_301_35@ For *nix builds that support visibility attribute,you can define similar behavior by
@H_301_35@ 44@H_301_35@
45@H_301_35@ setting default visibility to hidden by adding
@H_301_35@ 46@H_301_35@ -fvisibility=hidden (for gcc)
@H_301_35@ 47@H_301_35@ or
@H_301_35@ 48@H_301_35@ -xldscope=hidden (for sun cc)
@H_301_35@ 49@H_301_35@ to CFLAGS
@H_301_35@ 50@H_301_35@
51@H_301_35@ then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJSON_EXPORT_SYMBOLS does
@H_301_35@ 52@H_301_35@
53@H_301_35@ 54@H_301_35@
55@H_301_35@ #define@H_301_35@ CJSON_CDECL __cdecl
56@H_301_35@ #define@H_301_35@ CJSON_STDCALL __stdcall
57@H_301_35@
58@H_301_35@ export symbols by default,this is necessary for copy pasting the C and header file @H_301_35@ 59@H_301_35@ #if@H_301_35@ !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && !defined(CJSON_EXPORT_SYMBOLS)
60@H_301_35@ #define@H_301_35@ CJSON_EXPORT_SYMBOLS
61@H_301_35@ 62@H_301_35@
63@H_301_35@ #if@H_301_35@ defined(CJSON_HIDE_SYMBOLS)
64@H_301_35@ #define@H_301_35@ CJSON_PUBLIC(type) type CJSON_STDCALL
65@H_301_35@ #elif@H_301_35@ defined(CJSON_EXPORT_SYMBOLS)
66@H_301_35@ #define@H_301_35@ CJSON_PUBLIC(type) __declspec(dllexport) type CJSON_STDCALL
67@H_301_35@ #elif@H_301_35@ defined(CJSON_IMPORT_SYMBOLS)
68@H_301_35@ #define@H_301_35@ CJSON_PUBLIC(type) __declspec(dllimport) type CJSON_STDCALL
69@H_301_35@ 70@H_301_35@ #else@H_301_35@ /* !__WINDOWS__ */
71@H_301_35@ #define@H_301_35@ CJSON_CDECL
72@H_301_35@ #define@H_301_35@ CJSON_STDCALL
73@H_301_35@
74@H_301_35@ #if@H_301_35@ (defined(__GNUC__) || defined(__SUNPRO_CC) || defined (__SUNPRO_C)) && defined(CJSON_API_VISIBILITY)
75@H_301_35@ #define@H_301_35@ CJSON_PUBLIC(type) __attribute__((visibility("default"))) type
76@H_301_35@ #else@H_301_35@
77@H_301_35@ #define@H_301_35@ CJSON_PUBLIC(type) type
78@H_301_35@ 79@H_301_35@ 80@H_301_35@
81@H_301_35@ project version @H_301_35@ 82@H_301_35@ #define@H_301_35@ CJSON_VERSION_MAJOR 1
83@H_301_35@ #define@H_301_35@ CJSON_VERSION_MINOR 7
84@H_301_35@ #define@H_301_35@ CJSON_VERSION_PATCH 13
85@H_301_35@
86@H_301_35@ #include <stddef.h>
87@H_301_35@
88@H_301_35@ cJSON Types: @H_301_35@ 89@H_301_35@ 90@H_301_35@ 91@H_301_35@ 92@H_301_35@ 93@H_301_35@ 94@H_301_35@ 95@H_301_35@ 96@H_301_35@ 97@H_301_35@ #define@H_301_35@ cJSON_Raw (1 << 7) /* raw json */
98@H_301_35@
99@H_301_35@ #define@H_301_35@ cJSON_IsReference 256
100@H_301_35@ #define@H_301_35@ cJSON_StringIsConst 512
101@H_301_35@
102@H_301_35@ 103@H_301_35@ typedef cJSON
@H_301_35@104@H_301_35@ 105@H_301_35@ next/prev allow you to walk array/object chains. Alternatively,use GetArraySize/GetArrayItem/GetObjectItem @H_301_35@106@H_301_35@ next;
@H_301_35@107@H_301_35@ prev;
@H_301_35@108@H_301_35@ An array or object item will have a child pointer pointing to a chain of the items in the array/object. @H_301_35@109@H_301_35@ child;
@H_301_35@110@H_301_35@
111@H_301_35@ The type of the item,as above. @H_301_35@112@H_301_35@ type;
@H_301_35@113@H_301_35@
114@H_301_35@ The item's string,if type==cJSON_String and type == cJSON_Raw @H_301_35@115@H_301_35@ valuestring;
@H_301_35@116@H_301_35@ writing to valueint is DEPRECATED,use cJSON_SetNumberValue instead @H_301_35@117@H_301_35@ valueint;
@H_301_35@118@H_301_35@ The item's number,if type==cJSON_Number @H_301_35@119@H_301_35@ valuedouble;
@H_301_35@120@H_301_35@
121@H_301_35@ The item's name string,if this item is the child of,or is in the list of subitems of an object. @H_301_35@122@H_301_35@ 123@H_301_35@ } cJSON;
@H_301_35@124@H_301_35@
125@H_301_35@ typedef cJSON_Hooks
@H_301_35@126@H_301_35@ 127@H_301_35@ malloc/free are CDECL on Windows regardless of the default calling convention of the compiler,so ensure the hooks allow passing those functions directly. @H_301_35@128@H_301_35@ void@H_301_35@ *(CJSON_CDECL *malloc_fn)(size_t sz);
@H_301_35@129@H_301_35@ void@H_301_35@ (CJSON_CDECL *free_fn)(void@H_301_35@ *ptr);
@H_301_35@130@H_301_35@ } cJSON_Hooks;
@H_301_35@131@H_301_35@
132@H_301_35@ typedef cJSON_bool;
@H_301_35@133@H_301_35@
134@H_301_35@ Limits how deeply nested arrays/objects can be before cJSON rejects to parse them.
@H_301_35@135@H_301_35@ * This is to prevent stack overflows. @H_301_35@136@H_301_35@ #ifndef CJSON_NESTING_LIMIT
@H_301_35@137@H_301_35@ #define@H_301_35@ CJSON_NESTING_LIMIT 1000
138@H_301_35@ 139@H_301_35@
140@H_301_35@ returns the version of cJSON as a string @H_301_35@141@H_301_35@ CJSON_PUBLIC(const@H_301_35@ char@H_301_35@*) cJSON_Version(142@H_301_35@
143@H_301_35@ Supply malloc,realloc and free functions to cJSON @H_301_35@144@H_301_35@ CJSON_PUBLIC(void@H_301_35@) cJSON_InitHooks(cJSON_Hooks* hooks);
@H_301_35@145@H_301_35@
146@H_