了解json
JSON是什么?JSON是JavaScript Object Notation的缩写,它是一种数据交换格式。
在JSON出现之前,大家一直用XML来传递数据。因为XML是一种纯文本格式,所以它适合在网络上交换数据。XML本身不算复杂,但是,加上DTD、XSD、XPath、XSLT等一大堆复杂的规范以后,任何正常的软件开发人员碰到XML都会感觉头大了,最后大家发现,即使你努力钻研几个月,也未必搞得清楚XML的规范。
终于,在2002年的一天,道格拉斯·克罗克福特(Douglas Crockford)同学为了拯救深陷水深火热同时又被某几个巨型软件企业长期愚弄的软件工程师,发明了JSON这种超轻量级的数据交换格式
为了统一解析,JSON的字符串规定必须用双引号"",Object的键也必须用双引号""。
json数据类型
注意:json的数据类型在源码实现中和具体的编程语言有关,比如boolean在C中并没有相应的类型,C相关的实现库可能会用0和1表示。
格式规范
JSON基本操作
Json序列化:可以理解为利用程序生成Json字符串的过程。
Json反序列化:可以理解为利用程序将已有的Json字符串解析出我们需要的值的过程。
json格式校验
https://www.bejson.com/
使用cJson
cJSON的github地址(相当于官方源码地址)
https://github.com/DaveGamble/cJSON
cJSON 使用详解
https://blog.csdn.net/qq_32172673/article/details/88305781
JSON的简单介绍以及C语言的JSON库使用
https://www.cnblogs.com/liunianshiwei/p/6087596.html
C语言:cJSON库用法详解
代码示例
使用cJSON库对下面的JSON文件进行反序列化操作。将下面内容存为文件,读取后解析,推荐使用标准IO(fread)解析)。
{
"ver": "1.0",
"login": {
"user": "zhangsan",
"pwd": "123456"
},
"data": [{
"key": 1,
"type": 2,
"val": "10"
},
{
"key": 2,
"type": 1,
"val": "0"
},
{
"key": 3,
"type": 3,
"val": "22.5"
}
]
}
#include <stdio.h>
#include "cJSON.h"
int main(int argc, char const *argv[])
{
// 1.打开文件
FILE *fp;
fp = fopen("data.json", "r");
if (fp == NULL)
{
perror("open err");
return -1;
}
// 读取文件
char buf[1024] = {0};
size_t n = fread(buf, 1024, 1, fp);
if (n < 0)
{
perror("read err");
return -1;
}
// printf("read buf = \n%s\n", buf);
//反序列化
cJSON *root;
root = cJSON_Parse(buf);
if(NULL == root)
{
printf("parse err\n");
return -1;
}
cJSON *item = cJSON_GetObjectItem(root, "ver");
printf("key = %s, val = %s\n", item->string, item->valuestring);
//解析login节点
cJSON *login_item = cJSON_GetObjectItem(root, "login");
item = cJSON_GetObjectItem(login_item, "user");
printf("key = %s, val = %d\n", item->string, item->valueint);
//解析数组
cJSON *data_item = cJSON_GetObjectItem(root, "data");
int size = cJSON_GetArraySize(data_item);
for (size_t i = 0; i < size; i++)
{
cJSON *tmp = cJSON_GetArrayItem(data_item, i);
item = cJSON_GetObjectItem(tmp, "key");
printf("name = %s, val = %d\n", item->string, item->valueint);
}
return 0;
}