赞
踩
JSON 语法是 JavaScript 对象表示法语法的子集。数据在键/值对中;数据由逗号分隔;花括号保存对象, 也称一个文档对象;方括号保存数组, 每个数组成员用逗号隔开, 并且每个数组成员可以是文档对象或者数组或者键值对 。
(1) 对象(object): 一个对象以”{“开始,并以”}”结束。一个对象包含一系列非排序的名称/值对,每个名称/值对之间使用”,”分隔。
(2) 名称/值(collection): 名称和值之间使用”:”隔开。一个名称是一个字符串;一个值 (value)可以是双引号括起来的字符串(string)、数值(number)、true、false、null、对象(object)或者数组(array)。这些结构可以嵌套。
(1)、数据在键值对中;
(2)、数据由逗号分隔;
(3)、花括号保存对象;
(4)、方括号保存数组。
(1)、数值: 一系列0–9的数字组合,可以为负数或者小数。还可以用”e”或者”E”表示为指数形式。数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
(2)、字符串: 以""括起来的一串字符。字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。字符串(string)与C或者Java的字符串非常相似。
(3)、布尔值: 表示为true或者false。
(4)、数组(Array): 数组是值(value)的有序集合。一个数组以”[“(左中括号)开始,”]”(右中括号)结束。值之间使用”,”(逗号)分隔。数组索引从0开始。
(5)、对象(object): 对象是一个无序的”名称/值”对集合。一个对象以”{“开始,并以”}”结束。每个”名称”后跟一个”:”(冒号)。”名称/值”对之间使用”,”(逗号)分隔。
(6)、null: 空白可以加入到任何符号之间
下面是cJSON定义的头文件cJSON.h内容,里面为cJSON数据类型和相关宏定义。
一个重要概念:
在cjson中,json对象可以是json,可以是字符串,可以是数字。
该结构体 cJSON的声明定义解析见下面cjson数据结构定义:
#define cJSON_False 0
#define cJSON_True 1
#define cJSON_NULL 2
#define cJSON_Number 3
#define cJSON_String 4
#define cJSON_Array 5
#define cJSON_Object 6
typedef struct cJSON {
struct cJSON *next,*prev; /* 之前和之后节点,方便前后调用 */
struct cJSON *child; /* 定义一个子节点 */
int type; /* The type of the item, as above. cjson结构的类型上面宏定义的7中之一*/
char *valuestring; /* The item's string, if type==cJSON_String */
int valueint; /* The item's number, if type==cJSON_Number */
double valuedouble; /* The item's number, if type==cJSON_Number */
char *string; /* 项的名称字符串,如果此项是对象的子项或在对象的子项列表中。*/
} cJSON;
上面结构体中的数据类型定义使得JSON开发变得简单高效,本次标注所使用到的数据类型主要为string和valueint。
message.h 头文件里面声明了一部分函数,已经通过宏定义规定了一些操作的验证码。
相关代码注释见下方:
#ifndef __MESSAGE_H__
#define __MESSAGE_H__
//首先使用条件编译,防止多文件调用时候重复编译
#include "cJSON.h"
#define CODE_VERIFY_IP 1//IP验证码
#define CODE_VERIFY_DEVID 2//设备驱动验证码
#define CODE_VERIFY_P2P 3 //计算机分享网络技术:点对点
#define CODE_OPEN_AUTH_MSG_CHANNEL 4//打开用户消息通道码
#define CODE_OPEN_CHANNEL 1//打开通道代码
int GetJsonInt(const cJSON *root, const char *name, int *result);
char* GetJsonString(const cJSON *root, const char *name);
//两个相关函数的声明,函数详细解释于message.c文件
#endif
头文件中的相关操作码的宏定义没找到具体的引用位置。
3. message.c文件
这个头文件主要用来转换一些cJSON相关的数据类型,转换获得JSON数据中的指定数据类型int和string。
其中的函数使用"\communication_softbus_lite-master\authmanager\source\msg_get_deviceid.c"文件和wifi_auth_manager.c文件当中使用,用来转换判断一些数据类型并获得相关数据。
具体使用见上述文件分析:
#include "message.h"
int GetJsonInt(const cJSON *root, const char *name, int *result)
{
if (root == NULL || name == NULL || result == NULL) {
return -1;
//传入的参数只要有空值,就返回-1
}
cJSON *item = cJSON_GetObjectItem(root, name);
//调用cJSON_GetObjectItem()函数,可从cJSON结构体中查找某个子节点名称(键名称),如果查找成功可把该子节点序列化到cJSON结构体中。
if ((item == NULL) || (!cJSON_IsNumber(item))) {
//如果cJSON_GetObjectItem()函数执行失败,item则为NULL
//cJSON_IsNumber(item)用来判断item指向的数据类型是否为数字
//如果如果cJSON_GetObjectItem()函数执行失败或者item指向的数据类型不为数字,返回-1
return -1;
}
*result = item->valueint;
//执行成功并且item为数字,将result赋值item.valueint
return 0;
}
char* GetJsonString(const cJSON *root, const char *name)
{
if (root == NULL || name == NULL) {
//传入的参数只要有空值,就返回空值
return NULL;
}
cJSON *item = cJSON_GetObjectItem(root, name);
//调用cJSON_GetObjectItem()函数,可从cJSON结构体中查找某个子节点名称(键名称),如果查找成功可把该子节点序列化到cJSON结构体中。
if ((item == NULL) || (!cJSON_IsString(item))) {
//如果如果cJSON_GetObjectItem()函数执行失败或者item指向的数据类型不为string,返回NULL
return NULL;
}
return item->valuestring;
//执行成功并且item指向string类型,返回item->valuestring
}
message.c文件用来获取JSON数据中的指定数据类型,其中有一定的数据类型转换实现。GetJsonInt函数中涉及到number类型判断, GetJsonString函数涉及到string类型判断,判断成功则成功获取对应数据。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。