一、JSON开发思路
最近有个项目使用JSON数据和上位机进行通讯,我将开发历程分享给大家。起初我想用MDK自带的JSON库,编译也没问题,但最后发现该库对编译器有要求,不是很方便,最后我放弃了这条思路,用网上下载的JSON C代码写功能函数,最后所有功能都实现了。所以我强烈推荐大家采用这种开发思路,代码都是用C语言写的,看的见摸不着。
二、我对JSON代码的理解
2.1关于JSON的格式
{
"CMD": 4,
"DeviceType": 1,
"Control": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]
}
首先先上一段代码。这就是JSON代码的基本格式。用大括号包括一个JSON代码。代码包中包括很多的节点,节点类型有INT型,string型,double型。这是三种基本类型。除了基本类型可以是JSON节点,矩阵节点。这有点类似于C语言的数据类型,不光有基本类型还有组合类型。
接下来我们看看JSON的数据格式:
/* 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;
看到这是不是就基本明白JSON是咋回事了。首先是他的名字就是char *string;定义的内容。
他的类型由 int type来定义,然后就是三种基本的数据。除了基本的数据类型外还可以是组合数据类型包括可以是完整的JSON结构体和矩阵数据类型,这就类似于C语言的基本数据类型和组合数据类型。看来很多东西都是想通的。
2.2关于如何使用
该部分从两个角度来说这个问题:分别是如何解析和如何打包。针对每一个功能实现下面进行详细解析
2.2.1如何创建一个JSON
cJSON *json_p_rd, *tmp1,*tmp2,*tmp3,*tmp4,*tmp5,*tmp6,*tmp7;
tmp3=cJSON_CreateObject();
json_p_rd=cJSON_Parse(text);
从上面的代码就可以看明白如何创建和解析一个JSON数据结构体了。其中的text是JSON 数据的字符串。
2.2.2如何增加JSON节点
cJSON_AddNumberToObject(tmp3,"CMD",1);
cJSON_AddStringToObject(tmp3, "OperateString", "The Cmd Error !");
cJSON_AddItemToObject(tmp6,"OperateValue", tmp7=cJSON_CreateArray( ));
可以通过上面的函数增加节点
2.2.3如何获得一个节点
node = cJSON_GetObjectItem(json_p_rd,"Control");
if((tmp3 !=NULL) && (tmp->type==cJSON_Number))
{
dat1=tmp3;
}
上面的代码就可以获得一个节点。