1.JSON简介
JSON是一种轻量级的数据交换格式。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
2.JSON语法
在 JS 语言中,一切都是对象。因此,任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型:
对象表示为键值对
数据由逗号分隔
花括号保存对象
方括号保存数组
3.举例
{
“results”: [{
“number”: 2
“name”: “milk”
}]
}
number是键名,2是值(整型),name是键名,milk是值(字符串型),中括号表示数组。
4.程序分析
虽然SDK有封装好的cjson库,但是我这用更为熟悉的自己的cjson库。之前看的别人的博客,都没有对数组进行解析,所以这里主要是为了如何来解析数组。
①创建并解析json
void ICACHE_FLASH_ATTR parseJson() {
/*
解析以下一段json数据
{
"results": [{
"number": 2
"name": "milk"
}]
}
*/
//首先创建一个json数据
u8* jsonRoot ="{\"results\":[{\"number\":2,\"name\":\"milk\"}]}";
//首先整体判断是否为一个json格式的数据
cJSON *pJsonRoot = cJSON_Parse(jsonRoot);
//如果是否json格式数据
if (pJsonRoot !=NULL) {
//串口打印这段数据
char *s = cJSON_Print(pJsonRoot);
os_printf("pJsonRoot: %s\r\n", s);
cJSON_free((void *) s);
//由外至内解析
cJSON *resules = cJSON_GetObjectItem(pJsonRoot, "results");
//判断是否是json数据
if(resules)
{
//得到数组长度
int i=cJSON_GetArraySize(pJsonRoot);
//解析数组
cJSON *pAdress = cJSON_GetArrayItem(resules, 0);
//判断
if(pAdress)
{
//解析number字段int内容
cJSON *pNumber = cJSON_GetObjectItem(pAdress, "number");
//判断number字段是否存在
if (pNumber){
if (cJSON_IsNumber(pNumber))
os_printf("get Number:%d \n", pNumber->valueint);
}
else
os_printf("get Number failed \n");
//剖析里面的name字段 char
cJSON *pName = cJSON_GetObjectItem(pAdress, "name");
if (pName)
{
if (cJSON_IsString(pName))
os_printf("get Name : %s \n", pName->valuestring);
}
else
os_printf("get Name failed\n");
}
}
} else {
os_printf("this is not a json data ... \n");
}
cJSON_Delete(pJsonRoot);
}
②用库函数创建json
void creatJson(){
/*
{
"results": [{
"number": 2
"name": "milk"
}]
}
*/
//从里向外创建
cJSON *pRoot = cJSON_CreateObject();
cJSON *pVal = cJSON_CreateArray();
cJSON *pValue = cJSON_CreateObject();
//创建number和name
cJSON_AddNumberToObject(pRoot,"number",2);
cJSON_AddStringToObject(pRoot,"name","milk");
//
cJSON_AddItemToArray(pVal,pRoot);
cJSON_AddItemToObject(pValue,"results",pVal);
char *s = cJSON_Print(pValue);
os_printf("\r\n creatJson : %s\r\n", s);
cJSON_free((void *) s);
cJSON_Delete(pValue);
}
5.实验现象
6.程序源码
链接:https://pan.baidu.com/s/1mliLxneBhw8-Uhm9qq1fnQ
提取码:i2na