C语言 CJSON使用实例
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
JSON数据是一种轻量级的数据交互格式,在各个领域中普遍存在,如嵌入式中与上位机交互,获取某些API接口数据时,常常会使用到JSON数据,json采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交互语言,易于解析与生成。
在C语言中,通常使用cJSON对数据进行封装或解析,在使用中不要求熟记于心,但起码得知道怎么用,这对于数据交互相当便利!
提示:以下是本篇文章正文内容,下面案例可供参考
一、cJSON实例
cJSON 一共就两个文件:cJSON.c 和 cJSON.h
1. json数据的封装
创建节点用 cJSON base_config = cJSON_CreateObject(); 绑定节点用 cJSON_AddItemToObject(root, “base_config”, base_config); 添加字符串数据用 cJSON_AddStringToObject(net_config, “localIP”, info_cfg->localIP); 添加数字数据用 cJSON_AddNumberToObject(net_config, “localPort”, info_cfg->localPort); 当前节点是数组,添加数组用 cJSON_AddItemToArray(uart_config, uart_dev);
int configInfo_to_buffer(unsigned char *buffer, config_info_t* info_cfg){
/*创建一个json对象 */
cJSON *root = cJSON_CreateObject();
int ret = NOT_OK;
if(NULL == root)
goto CLOSE_JSON;
/*root下的子对象*/
cJSON *base_config = cJSON_CreateObject();
if(NULL == base_config)
goto CLOSE_JSON;
/*将子对象绑定在root下*/
cJSON_AddItemToObject(root, "base_config", base_config);
/*对json子节点 添加数据点*/
/*字符串*/
cJSON_AddStringToObject(base_config, "name", info_cfg->devcieName);
/*数字*/
cJSON_AddNumberToObject(base_config, "type", info_cfg->deviceType);
/*root下的对象*/
cJSON *net_config = cJSON_CreateObject();
if(NULL == net_config)
goto CLOSE_JSON;
/*绑定*/
cJSON_AddItemToObject(root, "net_config", net_config);
cJSON_AddStringToObject(net_config, "localIP", info_cfg->localIP);
cJSON_AddNumberToObject(net_config, "localPort", info_cfg->localPort);
/*root 下的数组对象*/
cJSON *uart_config = cJSON_CreateArray();
if(uart_config == NULL)
goto CLOSE_JSON;
/*绑定*/
cJSON_AddItemToObject(root, "uart_config", uart_config);
for(int i = 0; i < 2; i++) {
cJSON *uart_dev = cJSON_CreateObject();
cJSON_AddNumberToObject(uart_dev, "baudrate", info_cfg->uart_dev[i].baudrate);
cJSON_AddNumberToObject(uart_dev, "dbit", info_cfg->uart_dev[i].dbit);
cJSON_AddNumberToObject(uart_dev, "parity", info_cfg->uart_dev[i].parity);
cJSON_AddNumberToObject(uart_dev, "sbit", info_cfg->uart_dev[i].sbit);
cJSON_AddItemToArray(uart_config, uart_dev);
}
/*cJSON_Print 将json打印成字符串*/
unsigned char *jsonStr = cJSON_Print(root);
strcpy(buffer, jsonStr);
free(jsonStr);
ret = IS_OK;
CLOSE_JSON:
//释放内存 释放root就行了
cJSON_Delete(root);
return ret;
}
对于的JSON数据如下:
{
"base_config": {
"name": "test gateway",
"type": 0,
},
"net_config": {
"localIP": "",
"localPort": 0,
},
"uart_config": [{
"baudrate": 0,
"dbit": 0,
"parity": 0,
"sbit": 0
}, {
"baudrate": 0,
"dbit": 0,
"parity": 0,
"sbit": 0
}]
}
2. json数据解析
将上面创建的数据进行解析,解析代码如下: 获取节点用 cJSON_GetObjectItem(root, “base_config”); 获取数组大小用 cJSON_GetArraySize(uart_config); 获取指定数组用 cJSON_GetArrayItem(uart_config, i);
int buffer_to_configInfo(unsigned char *buffer, config_info_t* info_cfg){
/* 创建json对象 buffer为json数据*/
cJSON *root = cJSON_Parse((const char*)buffer);
int ret = NOT_OK;
if(root == NULL || root->child == NULL)
goto CLOSE_JSON;
cJSON *base_config = cJSON_GetObjectItem(root, "base_config");
if(base_config == NULL || base_config->child == NULL)
goto CLOSE_JSON;
{
cJSON *obj = cJSON_GetObjectItem(base_config, "name");
strcpy(info_cfg->devcieName, obj->valuestring);
obj = cJSON_GetObjectItem(base_config, "type");
info_cfg->deviceType = obj->valueint;
}
cJSON *net_config = cJSON_GetObjectItem(root, "net_config");
if(net_config == NULL || net_config->child == NULL)
goto CLOSE_JSON;
{
cJSON *obj = cJSON_GetObjectItem(net_config, "localIP");
strcpy(info_cfg->localIP, obj->valuestring);
obj = cJSON_GetObjectItem(net_config, "localPort");
info_cfg->localPort = obj->valueint;
}
//json数组解析
cJSON *uart_config = cJSON_GetObjectItem(root, "uart_config");
if(uart_config == NULL || uart_config->child == NULL)
goto CLOSE_JSON;
{ //获取数组大小
int uart_size = cJSON_GetArraySize(uart_config);
for(int i = 0; i < uart_size; i++) {
cJSON *uart_dev = cJSON_GetArrayItem(uart_config, i);
cJSON *obj = cJSON_GetObjectItem(uart_dev, "baudrate");
info_cfg->uart_dev[i].baudrate = obj->valueint;
obj = cJSON_GetObjectItem(uart_dev, "dbit");
info_cfg->uart_dev[i].dbit = obj->valueint;
obj = cJSON_GetObjectItem(uart_dev, "parity");
info_cfg->uart_dev[i].parity = obj->valueint;
obj = cJSON_GetObjectItem(uart_dev, "sbit");
info_cfg->uart_dev[i].sbit = obj->valueint;
}
}
ret = IS_OK;
CLOSE_JSON:
//释放内存
cJSON_Delete(root);
return ret;
}
注意: 如果通过指令编译会出错 cJSON编译会出现pow,floor未定义的引用 这时候加上 -lm就好了
|