嵌套 JSON 对象
JSON的字符串格式有要求
像 dfs{…}sd
在{ }的前面和后面多了字符都不行,还有其他的要求,就不一一列举了
可以用下面的连接来验证一下你的字符串是否符合Json
链接: JSON在线解析http://www.json.cn/
比如,我要解释的字符串是
p =
{
"method":"thing.service.property.set",
"id":"1521341546",
"params":{
"LightSwitch":1
},
"version":"1.0.0",
"resInfo":[
{
"minDistance":0,
"maxDistance":2
}
]
}
其中 params
resInfo
是嵌套的对象
1. cJSON * pSub_1 = cJSON_Parse( p )
作用:将一个JSON数据包,按照cJSON结构体的结构序列化整个数据包,并在堆中开辟一块内存存储cJSON结构体
返回值:成功返回一个指向内存块中的cJSON的指针,失败返回NULL
//按照cJSON结构体的结构序列化整个数据包
cJSON * pSub_1 = cJSON_Parse(p);
2. 解析第一层上的"id"的值是多少
//按照cJSON结构体的结构序列化整个数据包
cJSON * pSub_1 = cJSON_Parse(p);
if(pSub_1 != NULL)
{
//在pSub_1中查找"id"(字符串)
json_timestamp = cJSON_GetObjectItem(pSub_1 , "id");
if(json_timestamp->type == cJSON_String)
{
printf("id:%s\n", json_timestamp->valuestring);
}
}
printf串口输出 id:1521341546
3. 解释第二层上的"LightSwitch"的数值是多少
//按照cJSON结构体的结构序列化整个数据包
cJSON * pSub_1 = cJSON_Parse(p);
if(pSub_1 != NULL)
{
//在pSub_1中查找"params",嵌套到pSub_2(第二层)
cJSON * pSub_2 = cJSON_GetObjectItem(pSub_1 , "params");
//在pSub_2中查找"LightSwitch"(整型数值)
json_timestamp = cJSON_GetObjectItem(pSub_2, "LightSwitch");
if(json_timestamp->type == cJSON_Number)
{
printf("LightSwitch:%d\n", json_timestamp->valueint);
}
}
printf串口输出 LightSwitch:1
4.获取数组里面的元素 resInfo
cJSON * pSub_1 = cJSON_Parse(p);
if(pSub_1 != NULL)
{
cJSON *object = cJSON_GetArrayItem(pSub_1 , 0);// 数组里的第0个元素
if (object != NULL)
{
cJSON *item = cJSON_GetObjectItem(object, "minDistance");
if (item != NULL && item->type == cJSON_Number)
{
printf("minDistance:%d\n", item ->valueint);
}
}
}
printf串口输出 minDistance:0