JSON 语法是 JavaScript 对象表示语法的子集。
JSON 值可以是:
因为整个库只有一个C文件和一个头文件,所以只需复制cJSON.h并复制cJSON.c到项目源。
从cJSON源码可以找到:(键值对即key,value)
/* cJSON 类型定义: /
#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 结构体: */
typedef struct cJSON
{
struct cJSON *next, *prev;
//next/prev 遍历 数组或对象的前后指针. 或者使用GetArraySize/GetArrayItem/GetObjectItem
struct cJSON *child;
// 当类型为Array或者Object指向第一个元素,否则=NULL
int type;
// value的类型, 如上.
char *valuestring;
// 当类型为String或者Raw时valued
的字符串值 ,否则为NULL
int valueint;
double valuedouble;
// 类型为Number时valued
的值。int valueint已经被弃用,建议使用cJSON_SetNumberValue函数来赋值,valuedouble也会被赋值
char *string;
//key
的字符串值.
} cJSON;
cJSON函数简介
CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);
将JSON字符串解析出cJSON结构体,返回该结构体的指针。
因为函数中开辟了JSON结构体的内存空间,所以使用完毕后需要调cJSON_Delete函数释放JSON结构体内存空间。
CJSON_PUBLIC(void) cJSON_Delete(cJSON *item);
删除一个cJSON实体和所有子实体
CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item);
将传入的JSON结构转化为带格式的字符串 。
CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item);
将传入的JSON结构转化为无格式的字符串 。
因为函数中开辟了字符串的内存空间,所以使用完毕后需要调用cJSON_free或者free (cJSON_free调用的就是free)函数释放内存空间。
CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void);
// 创建一个数组
CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void);
//创建一个对象(文档)
因为函数中开辟了JSON结构体的内存空间,所以使用完毕后需要调cJSON_Delete函数释放JSON结构体内存空间。
//创建一个值类型的数据
CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num);
CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string);
//在对象中添加对应类型的键值对
CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number);
CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string);
//在对象中添加对象,数组
CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name);
//在数组/对象中添加项
CJSON_PUBLIC(void) cJSON_AddItemToArray(cJSON *array, cJSON *item);
CJSON_PUBLIC(void) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
示例:
#include
#include
#include "cJSON.h"
int main()
{
//创建一个老师json,转化为带格式的字符串并打印
char * json_data = NULL;
cJSON * teacher = NULL;
teacher = cJSON_CreateObject();
//cJSON_AddStringToObject(teacher,"name","laoshi1");
cJSON_AddItemToObject(teacher,"name",cJSON_CreateString("laoshi1"));
cJSON_AddNumberToObject(teacher,"age",32);
cJSON_AddStringToObject(teacher,"subject","math");
json_data = cJSON_Print(teacher);//每一次解析出json信息都会产生新的内存空间所以需要释放
printf("json msg is %s \n\n",json_data);
free(json_data);
//为老师添加一组学生
cJSON * students = NULL;
students = cJSON_CreateArray();
cJSON *student3 = NULL, *student4 = NULL, *student5 = NULL;
student3 = cJSON_CreateObject();
cJSON_AddStringToObject(student3,"name","student3");
cJSON_AddNumberToObject(student3,"age",16);
cJSON_AddNumberToObject(student3,"score",99);
student4 = cJSON_CreateObject();
cJSON_AddStringToObject(student4,"name","student4");
cJSON_AddNumberToObject(student4,"age",16);
cJSON_AddNumberToObject(student4,"score",87);
student5 = cJSON_CreateObject();
cJSON_AddStringToObject(student5,"name","student5");
cJSON_AddNumberToObject(student5,"age",16);
cJSON_AddNumberToObject(student5,"score",56);
cJSON_AddItemToArray(students,student3);
cJSON_AddItemToArray(students,student4);
cJSON_AddItemToArray(students,student5);
cJSON_AddItemToObject(teacher,"students",students);
//json_data = cJSON_Print(teacher);//每一次解析出json信息都会产生新的内存空间所以需要释放
json_data = cJSON_PrintUnformatted(teacher);//不带格式
printf("json msg is %s \n\n",json_data);
free(json_data);
cJSON_Delete(teacher);
return 0;
}
CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string);
// 根据键找json结点
CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string);
// 判断是否有key是string的项 如果有返回1 否则返回0 (其实就是调用了上面的cJSON_GetObjectItem()函数)
CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array);
//返回数组结点array中成员的个数
CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index);
// 根据数组下标index取array数组结点的第index个成员 返回该成员节点