Fork me on GitHub

CJSON-学习笔记

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
}

本文标题:CJSON-学习笔记

文章作者:Sui

发布时间:2016年06月18日 - 09:06

最后更新:2018年06月17日 - 23:06

原始链接:http://23171580.github.io/2016/06/18/CJSON-学习笔记/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。