文章目录
1 JSON介绍
JSON(JavaScript Object Notation, JS ) 是一种轻量级的数据交换格式。
1.1 采用完全独立于编程语言的文本格式来存储和表示数据;
1.2 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言;
1.3 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
2 JSON 语法
2.1 语法规则
- 数据在 “名称/值 对” 中
- 数据由 逗号 , 分隔
- 大括号 {} 保存 对象
- 中括号 [] 保存数组,数组可以包含多个对象
2.2 对象 object
对象(object):一个对象以 ”{“ 开始,并以 ”}” 结束。一个对象包含一系列 非排序的名称/值对,每个名称/值对之间使用”,”分隔。
{"Mode":"hello"}
2.3 名称/值 item
名称/值(item):名称和值之间使用”:”隔开。名称是一个字符串;值 (value)可以是双引号括起来的字符串(string)、数值(number)、true、false、null、对象(object)或者数组(array)
"name" : value
2.4 JSON 值 value
JSON 值可以是:
1、数字(整数int 或 浮点数 double)
{"opt":1234} /* 值是 1234 */
2、字符串(在双引号中)
{"Mode":"hello"} /* 值是字符串 "hello" */
3、逻辑值(true 或 false)
{ "status":true }
4、数组(在中括号中)
{""Mode":[1,1]}
5、对象(在大括号中)
{ "opt" : { "status":true } }
6、null
{ "opt":null }
3 cJSON
cJSON 开源项目位置: http://sourceforge.net/projects/cjson/
cJSON,目前来说,就只有两个文件,一个cJSON.c 一个cJSON.h文件。
3.1 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; /*** 存放 int类型的 值 ***/
/* The item's number, if type==cJSON_Number */
double valuedouble; /*** 存放 double类型的 值 ***/
/* 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;
3.2 cJSON.h 中的API
/* Supply a block of JSON, and this returns a cJSON object you can interrogate. Call cJSON_Delete when finished. */
extern cJSON *cJSON_Parse(const char *value); //从给定的json字符串中得到cjson对象
/* Render a cJSON entity to text for transfer/storage. Free the char* when finished. */
extern char *cJSON_Print(cJSON *item); //从cjson对象中获取有格式的json对象
/* Render a cJSON entity to text for transfer/storage without any formatting. Free the char* when finished. */
extern char *cJSON_PrintUnformatted(cJSON *item); //从cjson对象中获取无格式的json对象
/* Delete a cJSON entity and all subentities. */
extern void cJSON_Delete(cJSON *c); //删除cjson对象,释放链表占用的内存空间
CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void);
CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void);
/* Append item to the specified array/object. */
CJSON_PUBLIC(void) cJSON_AddItemToArray(cJSON *array, cJSON *item);
CJSON_PUBLIC(void) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
/* Helper functions for creating and adding items to an object at the same time.
* They return the added item or NULL on failure. */
CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean1);
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_AddRawToObject(cJSON * const object, const char * const name, const char * const raw);
CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name);
/* Returns the number of items in an array (or object). */
extern int cJSON_GetArraySize(cJSON *array); //获取cjson对象数组成员的个数
/* Retrieve item number "item" from array "array". Returns NULL if unsuccessful. */
extern cJSON *cJSON_GetArrayItem(cJSON *array,int item);//根据下标获取cjosn对象数组中的对象
/* Get item "string" from object. Case insensitive. */
extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);//根据名称 从对象中获取对应的 item 名称/值对
3.3 构造
3.3.1 创建对象
cJSON *jsonRespOut = NULL;
jsonRespOut = cJSON_CreateObject(); /* 创建一个对象 */
if (!jsonRespOut)
{
cJSON_Delete(jsonRespOut); /* 创建对象失败之后删除 对象 */
jsonRespOut = NULL;
return CMD_ERR;
}
3.3.2 往对象中添加 名称/值对 - 数字
int opt = 0x1234;
cJSON_AddNumberToObject(jsonRespOut, "opt", opt); /* 在对象中添加一个 名称/值对,这个值是数字 */
3.3.3 往对象中添加 名称/值对 - 字符串
char Value[] = "1.2.0.0";
cJSON_AddStringToObject(jsonRespOut, "version", (char *)Value);
3.3.4 往对象中添加 名称/值对 - 数组
int Value[2] = {1,1}
cJSON *array = NULL;
array = cJSON_CreateArray();
if (!array)
return;
cJSON_AddItemToObject(jsonRespOut, "voiceMode", array);
cJSON_AddItemToArray(array, cJSON_CreateNumber((int)Value[0]));
cJSON_AddItemToArray(array, cJSON_CreateNumber((int)Value[1]));
3.4 解析
3.4.1 从给定的json字符串中得到cjson对象
char *jsonBuff = "{"opt":62011,"optNum":1,"voiceMode":[1,1],"version":"1.2.0.0.0"}"; /* 存放JSON字符串数据 */
cJSON *jsonData = NULL;
jsonData = cJSON_Parse(jsonBuff); /* 从给定的json字符串中得到cjson对象 */
3.4.2 从cjson对象中根据名称得到 item 名称/值对
cJSON *item= NULL;
item = cJSON_GetObjectItem(jsonData, "opt"); /* 根据名称 ("opt") 从对象 (jsonData) 中获取对应的名称/值对(item) */
int opt = item->valueint;
3.4.3 解析数字
cJSON *item= NULL;
item = cJSON_GetObjectItem(jsonData, "opt"); /* 根据名称获取对应的值(cjson对象) */
int opt = item->valueint;
或者
/* 根据名称获取对应的值(cjson对象) */
int opt = 0xFF;
if (cJSON_HasObjectItem(jsonData, "opt"))
{
cJSON_GetObjectItem(jsonData, "opt")->valueint;
}
3.4.4 解析字符串
/* 根据名称获取对应的值(cjson对象) */
char *version = cJSON_GetObjectItem(jsonData, "version")->valuestring;
3.4.5 解析数组
cJSON *item= NULL;
item = cJSON_GetObjectItem(jsonData, "voiceMode");
size = cJSON_GetArraySize(item);
if(size != 2)
return PARAMS_ERR;
else
{
sound_channel = cJSON_GetArrayItem(item, 0)->valueint; /* 获取 数组[0] */
voice_mode = cJSON_GetArrayItem(item, 1)->valueint; /* 获取 数组[1] */
}