前言
一、cJSON简介
cJSON是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的JSON解析器。使用时,只需要包含cJSON.h和cJSON.c两个文件即可。
二、格式
1.JSON结构体
熟悉使用cJSON库函数可从cJSON结构体入手,cJSON结构体如下所示:
typedef struct cJSON {
struct cJSON *next,*prev;
struct cJSON *child;
int type;
char *valuestring;
int valueint;
double valuedouble;
char *string;
} cJSON;
2.使用说明
cJSON作为Json格式的解析库,其主要功能就是构建和解析cJson格式,主要有两个用途,一个是一端将要发送的数据已cjson形式封装,然后发送。另一端收到此数据后,还是按cjson形式解析,就得到想要的数据了。
三、使用步骤
1.书写格式
json的书写格式为 : {“名称”:“值”}
例子: {“sn”:rpi#001,“temperature”: 30765,“time”: 1}
2.创建cJSON
int pack_json(char *buf,double temp,time_t tm,char *devid)
{
if(!temp||!tm||!buf)
{
printf("wrong parameter!\n");
return -1;
}
cJSON *root = cJSON_CreateObject(); //创建json对象
if(!root)
{
printf("wrong:%s\n",strerror(errno));
return -3;
}
cJSON_AddStringToObject(root,"id",devid); //加入键值,加字符串
cJSON_AddNumberToObject(root,"temperature",temp); 加入键值,加数字
cJSON_AddNumberToObject(root,"time",tm);
char *s = cJSON_PrintUnformatted(root); //转化为普通字符串
strcpy(buf,s);
cJSON_Delete(root);
}
3.解析cJSON字符串
- 先将普通的json串处理成json对象
cJSON *root; root = cJSON_Parse(js_string);
- 获取关键字(从父层开始拿),我这里只写出无父层的情况
字符串:buf={“id”:“weizhiyan”,“temperature”:“12.3”,“time”:1}
int Parse_json(char *buf, char *id, double *tem,int *time,int size_id)
{
cJSON *root = NULL;
cJSON *temp = NULL;
char *ptr = NULL;
int len = 0;
if(!buf||!id||!tem||!time)
{
printf("buf is NULL!\n");
return -1;
}
root = cJSON_Parse(buf); //转化为json对象
if(!root)
{
printf("root is NULL!\n");
return -2;
}
temp = cJSON_GetObjectItem(root, "id"); //获取键值的内容
ptr = cJSON_Print(temp);
strcpy(id, ptr);
free(ptr);
temp = cJSON_GetObjectItem(root, "temperature");
ptr = cJSON_Print(temp);
*tem = atof(ptr);
free(ptr);
temp = cJSON_GetObjectItem(root, "time");
ptr = cJSON_Print(temp);
*time =atoi(ptr);
free(ptr);
cJSON_Delete(root);
}