目录
一、CJSON安装
1、安装(选择一种方式即可)
① 百度网盘安装连接
②GitHub连接
2、使用
二、JSON介绍
1、JSON简介
2、JSON数据组成
三、CJSON常用函数
1、 CSON对象的创建
2、创建一个新的JSON对象
3、cJSON_AddStringToObject()函数
4、创建一个CJSON数组
5、cJSON_AddItemToArray()
6、cJSON_AddItemToObject()
7、向指定键里添加bool值
8、cJSON_Print()
9、cJSON_Parse()
10、cJSON_GetObjectItem()
11、cJSON_GetArraySize()
12、cJSON_GetStringValue()
13、cJSON_GetNumberValue()
14、cJSON_GetArrayItem()
15、->valuestring
16、->valueint
四、CJSON小例子(重点)
1、使用CJSON组一个JSON字符串
2、解析JSON字符串并将其存放在结构体中并输出
一、CJSON安装
1、安装(选择一种方式即可)
① 百度网盘安装连接
链接: 百度网盘 请输入提取码
提取码: qp3j
②GitHub连接
GitHub - DaveGamble/cJSON: Ultralightweight JSON parser in ANSI C
2、使用
按照好了将.h文件拖入头文件.c文件拖入源文件,使用时包含头文件即可
二、JSON介绍
1、JSON简介
Json是一种轻量级的数据交换格式(也叫数据序列化方式)。Json采用完全独立于编程语言的文本格式 来存储和表示数据。简洁和清晰的层次结构使得 Json 成为理想的数据交换言。 易于人阅读和编 写,同时也易于机器解析和生成,并有效地提升网络传输效率。
2、JSON数据组成
JSON数据由键值对(key/value pairs)组成,其中键是字符串,值可以是字符串、数字、对象、数组、布尔值或null。JSON的数据结构主要包括以下几种类型:
-
对象(Object):用花括号{}表示,包含零个或多个键值对,每个键值对由键和值组成,键和值之间使用冒号:分隔,键值对之间使用逗号,分隔。
-
数组(Array):用方括号[]表示,包含零个或多个值,值之间使用逗号,分隔。
-
字符串(String):用双引号""或单引号''包裹的文本数据。
-
数字(Number):整数或浮点数。
-
布尔值(Boolean):表示真或假。
-
空值(null):表示空值。
三、CJSON常用函数
1、 CSON对象的创建
cJSON* person = NULL;//相当于一个指针,创建时先将其置空
2、创建一个新的JSON对象
cJSON *newObject = cJSON_CreateObject();
3、cJSON_AddStringToObject()函数
作用:将一个字符串类型的值添加到一个JSON对象中
/*
函数原型:
cJSON *cJSON_AddStringToObject(cJSON *object, const char *string, const char *value);
*/
//使用:
cJSON_AddStringToObject(newObject, "name", "John");
同类型常用函数原型:
//用于向JSON对象中添加一个数字类型的值
cJSON *cJSON_AddNumberToObject(cJSON *object, const char *string, double number);
//用于向JSON对象中添加一个新的键值对
void cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
4、创建一个CJSON数组
创建一个空的JSON数组,并返回指向该数组的指针。
/*
函数原型;
cJSON *cJSON_CreateArray(void);
*/
//使用:
cJSON* newArray=cJSON_CreateArray();
5、cJSON_AddItemToArray()
这个函数用于将一个JSON值(item)添加到JSON数组(array)中。函数会返回指向添加的JSON值的指针。
cJSON *cJSON_AddItemToArray(cJSON *array, cJSON *item);
6、cJSON_AddItemToObject()
这个函数用于将一个JSON值(item)添加到一个JSON对象(object)中,key是string。这样就可以在对象中创建一个key-value对。
void cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
7、向指定键里添加bool值
// This function adds a boolean true value to a JSON object with a specified key
void cJSON_AddTrueToObject(cJSON *object, const char *string);
// This function adds a boolean false value to a JSON object with a specified key
void cJSON_AddFalseToObject(cJSON *object, const char *string);
8、cJSON_Print()
cJSON_Print函数用于将cJSON对象转换为JSON格式的字符串,并返回该字符串的指针。
char* cJSON_Print(const cJSON *item);
9、cJSON_Parse()
cJSON_Parse函数是 cJSON 库中用于解析 JSON 字符串的函数。它接收一个 JSON 字符串作为输入,然后返回一个指向 cJSON 结构体的指针,该结构体表示了解析后的 JSON 数据。
cJSON* cJSON_Parse(const char *value);
value
参数是一个指向包含 JSON 数据的字符串的指针。调用该函数后,如果解析成功,将返回一个指向 cJSON 结构体的指针;如果解析失败,将返回 NULL。
10、cJSON_GetObjectItem()
用于获取 JSON 对象中指定键对应的值的函数。它接收一个 cJSON 对象和一个键的名称作为输入,然后返回该键对应的值。
cJSON* cJSON_GetObjectItem(const cJSON *object, const char *string);
其中,object
参数是一个指向 cJSON 对象的指针,表示要获取值的 JSON 对象;string
参数是一个指向包含键名称的字符串的指针,表示要获取的键的名称。调用该函数后,如果找到指定键的值,将返回一个指向 cJSON 结构体的指针,该结构体表示键对应的值;如果没有找到指定键,将返回 NULL。
例如,如果有一个 JSON 对象 jsonObject
包含键值对 "name": "John",我们可以使用 cJSON_GetObjectItem(jsonObject, "name")
来获取键 "name" 对应的值。
11、cJSON_GetArraySize()
用于获取 JSON 数组的大小(即包含的元素个数)的函数。它接收一个 cJSON 对象作为输入,并返回该数组中元素的数量。
int cJSON_GetArraySize(const cJSON *array);
其中,array
参数是一个指向 cJSON 对象的指针,表示要获取大小的 JSON 数组。调用该函数后,将返回表示数组大小的整数值,即数组中元素的数量。
例如,如果有一个 JSON 数组 jsonArray
包含三个元素,我们可以使用 cJSON_GetArraySize(jsonArray)
来获取该数组的大小,结果将会是 3。
12、cJSON_GetStringValue()
用于获取 JSON 字符串值的函数。它接收一个 cJSON 对象作为输入,并返回该对象中存储的字符串值。
const char *cJSON_GetStringValue(const cJSON *string);
13、cJSON_GetNumberValue()
获取 JSON 数值的函数。它接收一个 cJSON 对象作为输入,并返回该对象中存储的数值。
double cJSON_GetNumberValue(const cJSON *number);
14、cJSON_GetArrayItem()
用于获取 JSON 数组中特定索引位置的项的函数。它接受一个 cJSON 数组对象和一个索引作为输入,并返回该数组中指定索引位置的 cJSON 对象。
cJSON *cJSON_GetArrayItem(const cJSON *array, int index);
15、->valuestring
用于获取 JSON 对象中字符串值的函数
const char *value = cJSON_GetStringValue(json_object);
16、->valueint
获取 JSON 对象中的整数值
cJSON *json_object = cJSON_Parse("{\"key\": 123}");
cJSON *value = cJSON_GetObjectItem(json_object, "key");
int integer_value = value->valueint;
四、CJSON小例子(重点)
1、使用CJSON组一个JSON字符串
学习例子是最快上手的方法
创建了一个json对象person,里面含有字符串name,整型age,浮点型weight、还包含一个json对象address,以及一个布尔型student
#include<stdio.h>
#include"cJSON.h"
int main()
{
cJSON* cjson_person = NULL;
cJSON* cjson_address = NULL;
cJSON* cjson_skill = NULL;
char* str = NULL;
cjson_person = cJSON_CreateObject(); //创建一个JSON节点
cJSON_AddStringToObject(cjson_person, "name", "Lily"); //往JSON节点里添加一对键值对(字符型):姓名
cJSON_AddNumberToObject(cjson_person, "age", 22);//往JSON节点里添加一对键值对(整型):年龄
cJSON_AddNumberToObject(cjson_person, "weight", 50.2);//往JSON节点里添加一对键值对(浮点型):体重
cjson_address = cJSON_CreateObject(); //再创建一个JSON对象
cJSON_AddStringToObject(cjson_address, "country", "China");
cJSON_AddNumberToObject(cjson_address, "zip-code", 123456);
cJSON_AddItemToObject(cjson_person, "address", cjson_address);//将JSON对象嵌套在JSON对象里
cjson_skill = cJSON_CreateArray(); //创建一个JSON数组
cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( "C" )); //往JSON数组里添加数据
cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( "C++" ));
cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( "Python" ));
cJSON_AddItemToObject(cjson_person, "skill", cjson_skill);//将JSON数组添加到JSON对象中
cJSON_AddTrueToObject(cjson_person, "student"); //像JSON对象里添加一个布尔类型的数据
str = cJSON_Print(cjson_person); //将JSON数据打印
printf("%s\n", str);
return 0;
}
运行结果:
2、解析JSON字符串并将其存放在结构体中并输出
#include <stdio.h>
#include<stdbool.h>
#include "cJSON.h"
struct Address
{
char *country;
int zipCode;
};
struct Person
{
char *name;
int age;
double weight;
struct Address adds;
char *skill[3];
bool isStudent;
};
struct Address;
struct Person;
int main(void)
{
const char *str={"{\"name\": \"Lily\",\"age\":22,\"weight\":50.2,\"address\":{\"country\":\"China\",\"zip-code\":123456},\"skill\":[\"C\", \"C++\", \"Python\"],\"student\":true}"};
cJSON *person=cJSON_Parse(str); //将字符串str解析成一个json数组
int i;
struct Person m_person;
struct Address add;
cJSON *name=cJSON_GetObjectItem(person,"name");//从json对象中解析出字符型对象name
cJSON *age=cJSON_GetObjectItem(person,"age");//从json对象中解析出整型对象age
cJSON *weight=cJSON_GetObjectItem(person,"weight");//从json对象中解析出浮点型对象weight
cJSON *address=cJSON_GetObjectItem(person,"address");//从json对象中解析出json对象address
cJSON *country=cJSON_GetObjectItem(address,"country");
cJSON *zip=cJSON_GetObjectItem(address,"zip-code");
cJSON *skill=cJSON_GetObjectItem(person,"skill");//从json对象中解析出json数组
cJSON *skilln;
cJSON *IsStudent=cJSON_GetObjectItem(person,"student");//从json对象中解析出布尔类型对象name
int skill_size=cJSON_GetArraySize(skill);//获取json数组的元素个数
m_person.name=(char*)cJSON_GetStringValue(name);//提取字符型json对象的值
printf("name:%s\n",m_person.name);
m_person.age=(int)cJSON_GetNumberValue(age);//提取整型json对象的值
printf("age:%d\n",m_person.age);
m_person.weight=cJSON_GetNumberValue(weight);//提取浮点型json对象的值
printf("weight:%.2f\n",m_person.weight);
add.country=cJSON_GetStringValue(country);
add.zipCode=(int)cJSON_GetNumberValue(zip);
m_person.adds=add;
printf("country:%s,zip-code:%d\n",m_person.adds.country,m_person.adds.zipCode);
for(i=0;i<skill_size;i++)//循环遍历json数组提取元素并将其循环打印
{
skilln=cJSON_GetArrayItem(skill,i);
printf("skill%d:%s\n",i,skilln->valuestring);
m_person.skill[i]=(char*)skilln->valuestring;
}
m_person.isStudent=(bool)IsStudent->valueint;//提取布尔型对象
if(m_person.isStudent) printf("%s is a student!\n",m_person.name);
else printf("%s is not a student!\n",m_person.name);
return 0;
}
运行结果: