学习目的: 如何创建JSON对象、解析JSON字符串、访问JSON数据以及释放相关资源
一、JSON简介
JSON是一种轻量级的数据交换格式,常用于网络之间传输数据。它是一种文本格式,易于人阅读和编写,同时也易于机器解析和生成。
语法结构
1. 对象(Object):用花括号{}表示,包含一组无序的键值对。每个键值对之间用逗号分隔。
{
“key1”:“value1”
“key2”:“value2”
“key3”:“value3”
}
2. 数组(Array):用方括号[]表示,包含一组有序的值,每个值之间用逗号分隔。
{
"arrykey":[1,2,3,4]
}
3. 值(value):可以是字符串、数字、布尔值(表示真假)、对象、数组、null等。
{
"stringkey":"Hello,JSON!",
"numberkey":42,
"booleankey":true,
"nullkey":null
}
4. 字符串(string):由双引号括起来的Unicode字符序列。
{
"name":"John doe",
"city":"New York"
}
5. 数字(Number):可以是整数或浮点数。
{
"integer":42,
"float":3.14
}
6.布尔值(Boolean):表示真或假。
{
"isTrue":true,
"isFalse":false
}
7. null:表示空值。
{
"emptyvalue":null
}
二、下载CJSON
下载网址:
GitHub - DaveGamble/cJSON: Ultralightweight JSON parser in ANSI C
三、创建一个JSON
问题:如何用C语言代码去创建一个对象?
函数原型:
CJSON_PUBLIC((CJSON*)CJSON_Createobject(void);
无参数,返回值为CJSON的指针
cJSON类型详解
cJSON结构体如下定义:
/* 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;
next、prev:
struct cJSON *next;
struct cJSON *prev;
这两个成员用于在数组或对象中遍历链表。可以通过这两个指针在链表中移动,或者使用cJSON库提供的函数GetArraySize、GetArrayItem、GetObjectItem来进行相应的操作。
child:
struct cJSON *child;
如果当前项是一个数组或对象,child指向一个链表,表示数组或对象中的各个元素。通过这个链表,你可以访问数组的各个元素或对象的各个成员。
type:
int type:
表示当前项的类型
cJSON_False
cJSON_True
cJSON_NULL
cJSON_Number
cJSON_String
cJSON_Raw
cJSON_Array
cJSON_Object
valuestring:
char *valuestring;//表示值
如果当前项的类型是次cJSON_String或cJSON_Raw,valuestring指向存储字符串值的字符数组。
valueint:
int valueint;
DEPRECATED:以前用于存储整数值,现在推荐使用cJSON_SetNumbervalue函数设置数字值。
valuedouble:
double valuedouble;
如果当前项的类型是cJSON_Number,valuedouble存储该项的数字值
string:
char *string;->表示key
如果当前项是一个对象的成员,string存储该成员的名称(键)。如果当前项是一个数组的元素,string可能为NULL。这些成员组合在一起,使得cJSON结构体能够表示JSON数据的结构和内容,通过递归访问next、prev、child指针,可以遍历整个JSON数据。
四、创建键值对
使用下面这个函数即可创建一个键值对
CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string)
这个函数是cJSON库中的一个函数,用于向一个JSON对象(或者JSON字典)中添加一个字符串类型的键值对。
返回值:
cJSON *:
这个函数返回一个指向新添加的JSON元素的指针,这个元素包含了添加的字符串值。如果添加失败,返回NULL。
参数:
cJSON * const object:
这是一个指向JSON对象的指针,表示你要往哪个对象中添加键值对。
const char * const name:
这是一个字符串,表示你要添加的键的名称(key)。
const char * const string:
这是一个字符串,表示你要添加的值。这个值是一个字符串类型的JSON元素。
所以,这个函数的作用就是往一个JSON对象中添加一个键值对,键是name,值是string,然后返回一个指向新添加元素的指针。如果添加失败,返回NULL。
五、添加嵌套的JSON对象
使用下面这个函数为添加嵌套的JSON对象
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
返回值:
cJSON_bool:
这是一个表示成功或失败的布尔值,如果成功添加元素,返回true,否则返回false。
参数:
cJSON *object:
这是一个指向JSON对象的指针,表示你要往哪个对象中添加元素。
const char *string:
这是一个字符串,表示你要添加的键的名称。
cJSON *item:
这是一个指向要添加的JSON元素的指针。
六、添加数组
创建数组
CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void);
无参数,返回值为cJSON,这个数组的指针。
添加元素到数组
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item);
返回值:
cJSON_bool:
这是一个表示成功或失败的布尔值,如果成功添加元素,返回true,否则返回false。
参数:
cJSON *array:
这是一个指向JSON数组的指针,表示你要往哪个数组中添加元素。
cJSON *item:
这是一个指向要添加的JSON元素的指针。