JSON 简介
JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据互换格式。它基于ECMAScript(欧洲计算机制造商协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为抱负的数据互换语言。
以下是JSON的一些基本特点和用法:
- 数据格式:JSON可以表示两种类型的数据结构:
- 对象:一个无序的“‘名称/值’对”集合。一个对象以花括号“{}”括起来,每个“名称”后跟一个冒号“:”,“‘名称/值’ 对”之间使用逗号“,”分隔。
- 数组:是值(value)的有序集合。一个数组以方括号“[]”包罗起来,值的列表用逗号“,”分隔。
- 易于阅读和编写:JSON的格式是基于文本的,因此它很容易阅读和编写。同时,它也很易于机器解析和生成。
- 易于解析:JSON使用JavaScript的一个子集,这意味着在JavaScript环境中,你可以直接解析JSON数据,无需任何额外的解析库。
- 轻量级:JSON的语法非常简单,数据描述也很紧凑,因此它是轻量级的,得当在网络中传输。
- 语言无关:虽然JSON基于JavaScript的一个子集,但它可以被任何编程语言读取和写入。这使得JSON成为一种抱负的数据互换语言,可以用于服务器与浏览器之间,或者不同体系之间的数据互换。
cJSON(C语言JSON)库先容
cJSON(C语言JSON)库是一个用于在C语言中解析和生成JSON数据的轻量级开源库,重要包罗两个重要的源文件:cJSON.h(头文件)和cJSON.c(实现文件),使得在项目中集成和使用非常便捷。
- 重要特点
- 轻量级:cJSON的实现非常简洁,但功能齐全,得当在嵌入式体系或资源受限的环境中使用。
- 易于使用:通过简单的API调用,可以轻松地将JSON数据解析为C语言的数据结构(如数组、对象等),或将C语言的数据结构转换为JSON格式的字符串。
- 跨平台性:由于cJSON是纯C语言实现的,因此它具有精良的跨平台性,可以在多种操纵体系和编译器上运行。
- 数据结构
cJSON库的核心部分体现在他的数据结构上,是cJSON结构体,利用该结构体用于表示JSON对象、数组、键值对等元素。- typedef struct cJSON
- {
- /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem 用于在相同层级的对象或元素之间形成双向链表。*/
- struct cJSON *next;
- struct cJSON *prev;
- /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. 指向下一层级的子节点(如对象中的属性或数组中的元素)*/
- struct cJSON *child;
- /* The type of the item, as above.表示该元素的数据类型(如对象、数组、字符串、整数等)*/
- int type;
- /* The item's string, if type==cJSON_String and type == cJSON_Raw 用于存储该元素的具体值(根据`type`的不同而选择不同的成员来存储)*/
- char *valuestring;
- /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
- int valueint;
- /* The item's number, if type==cJSON_Number */
- double valuedouble;
- /* The item's name string, if this item is the child of, or is in the list of subitems of an object. 用于表示该键值对的名称*/
- char *string;
- } cJSON;
复制代码 - 重要功能
- 解析JSON数据:cJSON库可以将JSON格式的字符串解析为C语言的数据结构,方便后续的处理和操纵。
- 生成JSON数据:通过cJSON库,可以将C语言的数据结构转换为JSON格式的字符串,以便于传输、存储或与其他体系举行数据交互。
cJSON安装
cJSON项目托管在Github上,堆栈地址,因此可以用git命令直接克隆到本地,命令如下- git clone https://github.com/DaveGamble/cJSON.git
复制代码 直接到cJSON托管的github官网举行下载,然后拷贝到自己的项目文件夹下面,官网如下:- https://github.com/DaveGamble/cJSON
复制代码 官网的README还推荐了别的安装方法,CMAKE,Vcpkg等。
解析JSON数据常用API及简单举例
- CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);
- //提供一段JSON格式内容,这将返回一个您可以查询的cJSON对象。
- CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string);
- //从Object中获取项目“string”。不区分大小写。
- CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string);
- //从Object中获取项目“string”。区分大小写。
- cJSON_ArrayForEach(element, array);
- //带参数宏定义,遍历数组array中的element元素
- CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON * const item);
- CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item);
- CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item);//将cJSON打印
复制代码 应用举例:- //recvbuf={"results":[{"location":{"id":"WS0E9D8WN298","name":"广州","country":"CN","path":"广州,广州,广东,中国","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"阴","code":"9","temperature":"27"},"last_update":"2024-06-11T19:38:38+08:00"}]}
- ...
- cJSON *wea = cJSON_Parse(recvbuf); // 1.解析
- printf("%s\n", cJSON_Print(wea)); // 打印预览
- cJSON *results = cJSON_GetObjectItem(wea, "results"); // 2.打开遇到的第一个对象
- cJSON *result = NULL;
- cJSON_ArrayForEach(result, results) // 3.遍历"results"数组
- {
- cJSON *now = cJSON_GetObjectItem(result, "now"); // 将遇到的result对象中,如果存在“now”的元素就记录
- cJSON *temperature = cJSON_GetObjectItem(now, "temperature"); // 将遇到的now对象中,如果存在“temperature”的元素就记录
- printf("temperature :%d\n", atoi(temperature->valuestring)); // printf("temperature :%s\n", temperature->valuestring);
- }
- ...
复制代码 输出结果- {
- "results": [{
- "location": {
- "id": "WS0E9D8WN298",
- "name": "广州",
- "country": "CN",
- "path": "广州,广州,广东,中国",
- "timezone": "Asia/Shanghai",
- "timezone_offset": "+08:00"
- },
- "now": {
- "text": "阴",
- "code": "9",
- "temperature": "27"
- },
- "last_update": "2024-06-11T19:38:38+08:00"
- }]
- }
- temperature :27
复制代码 生成JSON数据API及简单举例
(和下次的base64编码一起更新)
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |