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小时内删除。