JSON学子总结及CJson代码分析
“JSON”的全称是“JavaScript Object Notation”,即JavaScript对象符号,是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。JSON采用与编程语言无关的文本格式,但是也使用了类C语言(包括C、C++、C#、Java、JavaScript、Python等)的习惯,这些特性使JSON成为理想的数据交换格式。
JSON建构于两种结构:
(1)“名称/值”对的集合。不同的语言中,其被理解为对象(“object”)、纪录(“record”)、结构(“struct”)、字典(“dictionary”)、哈希表(“hash table”)、有键列表(“keyed list”)或者关联数组(“associative array”)。
(2)值的有序列表。在大部分语言中,其被理解为数组(“array”)。
简单理解,JSON的定义由以下四句话就全部定义了。
●并列的数据之间用逗号(”,”)分隔。
●映射用冒号(”:”)表示。
●并列数据的集合(数组)用方括号("[]")表示。
●映射的集合(对象)用大括号(”{}”)表示。
对JSON的解析
主要学习了通过一个简短的开源的C语言代码cJson对JSON格式数据进行解析。cJson的代码很简短,全部只有20KB左右,主要包含了解析、构造、编辑JSON数据,这些功能主要通过其自定义的cJSON数据结构。cJSON数据结构对JSON格式数据进行了描述,并通过程序提供了许多操作,cJSON数据结构定义如下所示:
/* The cJSON structure: */ typedef struct cJSON { struct cJSON *next,*prev; /* 如果该Json结构在数组中,则它的前后节点*/ struct cJSON *child; /* 如果存在子对象,其第一个子对象*/ int type; /* Json对象的类型*/ char *valuestring; /* The item's string, if type==cJSON_String*/ int valueint; /* The item's number, if type==cJSON_Number*/ double valuedouble; /* The item's number, if type==cJSON_Number*/ char *string; /* Json对象的名字*/ } cJSON; |
Json对象的类型
/* cJSON Types: */ #define cJSON_False 0 #define cJSON_True 1 #define cJSON_NULL 2 #define cJSON_Number 3 #define cJSON_String 4 #define cJSON_Array 5 #define cJSON_Object 6 |
以下通过下面的JSON格式数据为例分析cJson中的基本函数,数据在C语言中表示如下:
char * value = "[{\"name\":\"鸟巢\",\"point\":{\"lat\":\"39.990\",\"lng\":\"116.397\"},\"desc\":\"奥运会主场地\"},{\"name\":\"北大乒乓球馆\",\"point\":{\"lat\":\"39.988\",\"lng\":\"116.315\"},\"desc\":\"乒乓球比赛场地\"},{\"name\":\"北京工人体育场\",\"point\":{\"lat\":\"39.930\",\"lng\":\"116.446\"},\"desc\":\"足球比赛场地\"}]"
cJson中的基本函数主要总结如下:
函数功能 | 解析函数 |
函数定义 | extern cJSON *cJSON_Parse(const char *value) |
函数说明 | 传入一个字符串,返回一个cJSON,可以通过if (!json)来判断解析是否出错,如果出错,可以通过printf("Error before: [%s]\n",cJSON_GetErrorPtr())打印出错位置。 |
函数功能 | 打印cJSON |
函数定义 | extern linux下vim命令char *cJSON_Print(cJSON *item) |
函数说明 | 传入一个cJSON,将会以排好版的格式打印JSON。 |
对上面的value进行解析并打印后,输出的效果如下所示:
1kb的准确数值是[{ "name": "鸟巢", "point": { "lat": "39.990", "lng": "116.397" }, "desc": "奥运会主场地" }, { "name": "北大乒乓球馆", "point": { "lat": "39.988", "lng": "116.315" }, "desc": "乒乓球比赛场地" }, { "name": "北京工人体育场", "point": { "lat": "39.930", "lng": "116.446" }, "desc": "足球比赛场地" vba从入门到精通书籍 }] |
函数功能 | 释放cJSON内存空间 |
函数定义 | extern void cJSON_Delete(cJSON *c) |
函数说明 | 获得了一个cJSON,当使用完了之后要删除,因为返回的throwable转stringcJSON是通过malloc的方式分配的,如果用完不及时释放会造成内存泄露。 |
函数功能 | 获取cJSON大小 |
函数定义 | extern int cJSON_GetArraySize(cJSON *array) |
函数说明 | 返回数组或对象中的大小,只要该对象下包括其他对象,各对象一般以“,”分隔。 |
函数功能 | 以index的方式获取cJSON数组或对象相应的项 |
函数定义 | extern cJSON *cJSON_GetArrayItem(cJSON *array,worthyintpython请求并解析json数据 item) |
函数说明 | 返回数组或对象中相应index的项,不到会返回NULL。 |
函数功能 | 以名称的方式获取cJSON数组或对象相应的项 |
函数定义 | extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string) |
函数说明 | 获取当前cJSON对象下有名字的cJSON对象,不到会返回NULL。 |
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论