JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它易于人阅读和编写,同时也方便机器解析和生成,成为一种理想的数据交换语言。
CJSON是一个用c写的JSON解析器,它非常小巧,只有单个文件,使用起来非常方便,本文将简单介绍CJSON的使用方法。
JSON的详细介绍可以参考:http://www.json.org/ 。其语法是JavaScript语法的子集,可以理解成无序的、可嵌套的key-value键值对集合,这些key-value键值对是以结构体或数组的形式来组织的。
JSON的数据包括以下类型:
对象(object)是一个无序的key/value对集合。一个对象以“{”(左大括号)开始,“}”(右大括号)结束,每个key后跟一个“:”(冒号),key/value对之间使用“,”(逗号)分隔。
数组(array)是值的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束,值之间使用“,”(逗号)分隔。
值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。 字符串与C或者Java的字符串非常相似。
数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
对象表示为“{}”括起来的内容,数据结构为{key1:value1, key2:value2, …}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,这个属性值的类型可以是数字、字符串、数组、对象几种。
数组表示为“[]”括起来的内容,数据结构为 [“value1”, “value2”, “value3”, …],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。
下面是一个CJSON生成对象的方法:
void ICACHE_FLASH_ATTR//此处是esp8266动态分配内存
create_objects()
{
cJSON *root, *coord_body, *weather_body, *weather_list, *main_body, *wind_body, *clouds_body, *sys_body;
char *out;
root=cJSON_CreateObject();
cJSON_AddItemToObject(root,"coord" , coord_body=cJSON_CreateObject());
cJSON_AddNumberToObject(coord_body, "lon", 1204);
cJSON_AddNumberToObject(coord_body, "lat", 3736);
cJSON_AddItemToObject(root, "weather", weather_body=cJSON_CreateArray());
cJSON_AddItemToArray(weather_body, weather_list=cJSON_CreateObject());
cJSON_AddNumberToObject(weather_list, "id", 802);
cJSON_AddStringToObject(weather_list, "main", "Clouds");
cJSON_AddStringToObject(weather_list, "description", "scattered clouds");
cJSON_AddStringToObject(weather_list, "icon", "03d");
cJSON_AddStringToObject(root,"base","stations");
cJSON_AddItemToObject(root,"main",main_body=cJSON_CreateObject());
cJSON_AddNumberToObject(main_body,"temp", 291989);
cJSON_AddNumberToObject(main_body,"pressure",10203);
cJSON_AddNumberToObject(main_body,"humidity", 46);
cJSON_AddNumberToObject(main_body,"temp_min", 291989);
cJSON_AddNumberToObject(main_body,"temp_max", 291989);
cJSON_AddNumberToObject(main_body,"sea_level", 103786);
cJSON_AddNumberToObject(main_body,"grnd_level", 10203);
cJSON_AddItemToObject(root, "wind", wind_body = cJSON_CreateObject());
cJSON_AddNumberToObject(wind_body, "speed", 527);
cJSON_AddNumberToObject(wind_body, "deg", 680153);
cJSON_AddItemToObject(root, "clouds", clouds_body = cJSON_CreateObject());
cJSON_AddNumberToObject(clouds_body, "all", 48);
cJSON_AddNumberToObject(root, "dt", 1475745655);
cJSON_AddItemToObject(root, "sys", sys_body = cJSON_CreateObject());
cJSON_AddNumberToObject(sys_body, "message", 93);
cJSON_AddStringToObject(sys_body, "country", "CN");
cJSON_AddNumberToObject(sys_body, "sunrise", 1475704711);
cJSON_AddNumberToObject(sys_body, "sunset", 1475746419);
cJSON_AddNumberToObject(root, "id", 1784953);
cJSON_AddStringToObject(root, "name", "Zhaoyuan");
cJSON_AddNumberToObject(root, "cod", 200);
out=cJSON_Print(root);
cJSON_Delete(root);
os_printf("%s\n",out);
os_free(out);
}
生成的JSON对象:
{
"coord": {
"lon": 1204,
"lat": 3736
},
"weather": [{
"id": 802,
"main": "Clouds",
"description": "scattered clouds",
"icon": "03d"
}],
"base": "stations",
"main": {
"temp": 291989,
"pressure": 10203,
"humidity": 46,
"temp_min": 291989,
"temp_max": 291989,
"sea_level": 103786,
"grnd_level": 10203
},
"wind": {
"speed": 527,
"deg": 680153
},
"clouds": {
"all": 48
},
"dt": 1475745655,
"sys": {
"message": 93,
"country": "CN",
"sunrise": 1475704711,
"sunset": 1475746419
},
"id": 1784953,
"name": "Zhaoyuan",
"cod": 200
}