C语言处理json字符串
JSON语法说明
先来看一个简单的JSON
1 {
2 "stars": [
3 {
4 "name": "Faye",
5 "address": "北京"
6 },
7 {
8 "name": "andy",
9 "address": "香港"
10 },
11 {
12 "name": "eddie",
13 "address": "台湾"
14 },
15
16 ]
17 }
JSON 语法是 JavaScript 对象表示法语法的子集。数据在键/值对中;数据由逗号分隔;花括号保存对象, 也称一个文档对象;方括号保存数组, 每个数组成员用逗号隔开, 并且每个数组成员可以是文档对象或者数组或者键值对 。
JSON基于两种结构:
“名称/值”对的集合(A collection of name/value pairs)。不同的编程语言中,它被理解为对象(object),纪录(record),结构(struct),字(dictionary),哈希表(hashtable),有键列表(keyed list),或者关联数组 (associative array)。
值的有序列表(An ordered list of values)。在大部分语言中,它被实现为数组(array),矢量(vector),列表(list),序列(sequence)。
JSON的三种语法:
键/值对 key:value,用半角冒号分割。 比如 "name":"Faye"
文档对象 JSON对象写在花括号中,可以包含多个键/值对。比如{ "name":"Faye" ,"address":"北京" }。
数组 JSON 数组在方括号中书写: 数组成员可以是对象,值,也可以是数组(只要有意义)。 {"love": ["乒乓球","高尔夫","斯诺克","羽毛球","LOL","撩妹"]}
附cJSON库下载地址 https://github.com/DaveGamble/cJSON
cJSON库在使用的时候只需要如下两步:将cJSON.c(或者库文件) 和 cJSON.h添加到项目中即可;如果在命令行中进行链接 还需要加上-lm 表示链接math库 .
C语言函数库写JSON文件 :
从缓冲区中解析出JSON结构:extern cJSON *cJSON_Parse(const char *value);
解析一块JSON数据返回cJSON结构, 在使用完之后调用cJSON_Delete函数释放json对象结构。
将传入的JSON结构转化为字符串 :extern char *cJSON_Print(cJSON *item);
可用于输出到输出设备, 使用完之后free(char *) 。
将JSON结构所占用的数据空间释放 :void cJSON_Delete(cJSON *c)
创建一个值类型的数据 :extern cJSON *cJSON_CreateNumber(double num);
extern cJSON *cJSON_CreateString(const char *string);
extern cJSON *cJSON_CreateArray(void);
创建一个对象(文档) :extern cJSON *cJSON_CreateObject(void);
数组创建以及添加 :cJSON *cJSON_CreateIntArray(const int *numbers,int count);
void cJSON_AddItemToArray(cJSON *array, cJSON *item);
JSON嵌套 :
【 向对象中增加键值对】 cJSON_AddItemToObject(root, "rows", 值类型数据相关函数());
【 向对象中增加数组】 cJSON_AddItemToObject(root, "rows", cJSON_CreateArray());
【 向数组中增加对象】 cJSON_AddItemToArray(rows, cJSON_CreateObject());
几个能提高操作效率的宏函数 :#define cJSON_AddNumberToObject(object,name,n) \
cJSON_AddItemToObject(object, name,cJSON_CreateNumber(n))
#define cJSON_AddStringToObject(object,name,s)\
cJSON_AddItemToObject(object, name, cJSON_CreateString(s))
C语言库函数解析JSON文件 :
根据键找json结点 :extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string)
判断是否有key是string的项 如果有返回1 否则返回0 :extern int cJSON_HasObjectItem(cJSON *object,const char *string)
{ return cJSON_GetObjectItem(object,string)?1:0; }
返回数组结点array中成员的个数 :extern int cJSON_GetArraySize(cJSON *array);
根据数组下标index取array数组结点的第index个成员 返回该成员节点 :extern cJSON *cJSON_GetArrayItem(cJSON *array,int index);
遍历数组 :#define cJSON_ArrayForEach(pos, head) for(pos = (head)->child; pos != NULL; pos = pos->next)
我们先来小试牛刀,编写一个输出到屏幕的简单json结构,代码1如下:
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include"cJSON.h"
4
5 int main(void)
6 {
7 char *data = "{\"love\":[\"LOL\",\"Go shopping\"]}";
8 //从缓冲区中解析出JSON结构
9 cJSON * json= cJSON_Parse(data);
10
11 //将传入的JSON结构转化为字符串 并打印
12 char *json_data = NULL;
13 printf("data:%s\n",json_data = cJSON_Print(json));
14
15 free(json_data);
16 //将JSON结构所占用的数据空间释放
17 cJSON_Delete(json);
18 return 0;
19 }
如下所示编译程序,执行程序,可以看到屏幕输出一个简单的json结构
下面我们在改进一下程序,输出到屏幕的同时,生成对应的json文件,代码2如下:
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 #include"cJSON.h"
5
6 int main(void)
7 {
8 char *char_json = "{\"habit\":\"lol\"}";
9 //从缓冲区中解析出JSON结构
10 cJSON *json = cJSON_Parse(char_json);
11 //将传入的JSON结构转化为字符串 并打印
12 char *buf = NULL;
13 printf("data:%s\n",buf = cJSON_Print(json));
14 //打开一个exec.json文件,并写入json内容
15 FILE *fp = fopen("exec.json","w");
16 fwrite(buf,strlen(buf),1,fp);
17
18 fclose(fp);
19 free(buf);
20 cJSON_Delete(json);
21 return 0;
22 }
如下图所示进行编译,执行程序,查看生成的对应的json文件
下面我们生成一个生成一个json结构稍微复杂一点的json文件,代码3如下:
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 #include"cJSON.h"
5
6 int main(void)
7 {
8 //创建一个空的文档(对象)
9 cJSON *json = cJSON_CreateObject();
10
11 //向文档中增加一个键值对{"name":"王大锤"}
12 cJSON_AddItemToObject(json,"name",cJSON_CreateString("王大锤"));
13 //向文档中添加一个键值对
14 //cJSON_AddItemToObject(json,"age",cJSON_CreateNumber(29));
15 cJSON_AddNumberToObject(json,"age",29);
16
17 cJSON *array = NULL;
18 cJSON_AddItemToObject(json,"love",array=cJSON_CreateArray());
19 cJSON_AddItemToArray(array,cJSON_CreateString("LOL"));
20 cJSON_AddItemToArray(array,cJSON_CreateString("NBA"));
21 cJSON_AddItemToArray(array,cJSON_CreateString("Go shopping"));
22
23 cJSON_AddNumberToObject(json,"score",59);
24 cJSON_AddStringToObject(json,"address","beijing");
25
26 //将json结构格式化到缓冲区
27 char *buf = cJSON_Print(json);
28 //打开文件写入json内容
29 FILE *fp = fopen("create.json","w");
30 fwrite(buf,strlen(buf),1,fp);
31 free(buf);
32 fclose(fp);
33 //释放json结构所占用的内存
34 cJSON_Delete(json);
35 return 0;
36 }
编译程序,执行程序,查看生成的json文件
下面再来编写一个,代码4如下:
1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4 #include"cJSON.h"
5
6 int main(void)
7 {
8 //先创建空对象
9 cJSON *json = cJSON_CreateObject();
10 //在对象上添加键值对
11 cJSON_AddStringToObject(json,"country","china");
12 //添加数组
13 cJSON *array = NULL;
14 cJSON_AddItemToObject(json,"stars",array=cJSON_CreateArray());
15 //在数组上添加对象
16 cJSON *obj = NULL;
17 cJSON_AddItemToArray(array,obj=cJSON_CreateObject());
18 cJSON_AddItemToObject(obj,"name",cJSON_CreateString("Faye"));
19 cJSON_AddStringToObject(obj,"address","beijing");
20 //在对象上添加键值对
21 cJSON_AddItemToArray(array,obj=cJSON_CreateObject());
22 cJSON_AddItemToObject(obj,"name",cJSON_CreateString("andy"));
23 cJSON_AddItemToObject(obj,"address",cJSON_CreateString("HK"));
24
25 cJSON_AddItemToArray(array,obj=cJSON_CreateObject());
26 cJSON_AddStringToObject(obj,"name","eddie");
27 cJSON_AddStringToObject(obj,"address","TaiWan");
28
29 //清理工作
30 FILE *fp = fopen("create.json","w");
31 char *buf = cJSON_Print(json);
32 fwrite(buf,strlen(buf),1,fp);
33 fclose(fp);
34 cJSON_Delete(json);
35 return 0;
36 }
编译执行程序,效果如下图所示:
写了这么多生成xml的例子,下面我们来一个解析的例子,代码5如下:
编译程序,执行程序,解析出json信息如下图所示,
关于更多的json学习,可以自己根据提供的cJSON.h cJSON.c进行深入的学习,学无止境,我这里就介绍到这里了。
C语言处理json字符串的更多相关文章
- Json对象与Json字符串互转(4种转换方式)
Json字符与Json对象的相互转换方式有很多,接下来将为大家一一介绍下,感兴趣的朋友可以参考下哈,希望可以帮助到你 1>jQuery插件支持的转换方式: 复制代码代码如下: $.parseJS ...
- Json字符串和Json对象的简单总结
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率). ...
- JavaScript操作JSON的方法总结,JSON字符串转换为JSON对象
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...
- .NET中如何使用反序列化JSON字符串/序列化泛型对象toJsonStr
在进行 .NET Web MVC 框架开发的网站程序的时候,我们都会遇到最关键的问题,数据传输. .NET MVC 4中的ControllerBase类建议我们用ViewBag动态数据字典形式(t ...
- Json字符串转换为java对象的各种实现方法【json_lib框架、Gson、org.json】
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://mengzhengbin520.blog.51cto.com/7590564/12 ...
- Json及Json字符串
JSON(JavaScript Object Notation)是一种独立于开发语言的用于存储和交换文本数据的格式,JSON 语法是JavaScript 语法的子集. Json 可以保存数组格式和对象 ...
- 彻底了解构建 JSON 字符串的三种方式
原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7701856.html 前言:JSON 是轻量级的数据交换格式,很常用,尤其是在使用 Ajax ...
- json字符串转换成json对象,json对象转换成字符串,值转换成字符串,字符串转成值
一.json相关概念 json,全称为javascript object notation,是一种轻量级的数据交互格式.采用完全独立于语言的文本格式,是一种理想的数据交换格式. 同时,json是jav ...
- javascript对象序列化(对象与JSON字符串的互换)
前一段时间用到h5的本地存储---需要把某个js对象存储在浏览器的本地存储中,用到了javascript对象的序列化与反序列化 所谓的序列化就是将对象的状态信息转换为可以存储或传输的形式的过程,基本上 ...
随机推荐
- Slasher Flick-freecodecamp算法题目
Slasher Flick(截断数组) 要求 返回一个数组被截断n个元素后还剩余的元素,截断从索引0开始. 思路 利用.splice(0,howMany)删除数组中索引从0开始的howMany个元素 ...
- IntelliJ IDEA 配置 Tomcat 运行web项目
运行前提: 配置好 Java 的运行环境 配置好 Tomcat 安装 IntelliJ IDEA 开始 1.创建项目并配置 关于配置SDK,等建完项目再说 没有配置SDK的话 会出现下面的弹框,点击 ...
- 【kindle】【转发】kindle链接WIFI自动断开问题
在电脑上新建一个新文件,名为“WIFI_NO_NET_PROBE”,同时把后缀名删掉,让它变成一个无格式文件.Kindle 连接电脑,把新建的文件放进Kindle的根目录,断开Kindle之后重启Ki ...
- 「新手必看」Python+Opencv实现摄像头调用RGB图像并转换成HSV模型
在ROS机器人的应用开发中,调用摄像头进行机器视觉处理是比较常见的方法,现在把利用opencv和python语言实现摄像头调用并转换成HSV模型的方法分享出来,希望能对学习ROS机器人的新手们一点帮助 ...
- 运用Python制作你心目中的完美女神脸!
简介 写这个项目的本来目的是通过构建一个神经网络来训练人脸图片,最后达到能根据图片自动判断美丑的效果.可能是因为数据集过小,或者自己参数一直没有调正确,无论我用人脸关键点训练还是卷积神经网络训练,最后 ...
- Python9-网络编程2-day31
基于UDP协议的socket #server import socket sk = socket.socket(type=socket.SOCK_DGRAM) sk.bind(('127.0.0.1' ...
- 原来针对新唐mcu,keil有免费许可
MDK for Nuvoton Cortex-M0/M23:The MDK for Nuvoton Cortex-M0/M23 is a license paid by Nuvoton. It is ...
- mysql Plugin ‘InnoDB’ init function returned error
问题描述: 非正常关闭mysql,同时更改了my.cnf 导致启动时不支持innodb,出现如下错误: [ERROR] Plugin ‘InnoDB’ init function returned ...
- Aizu - 1386 Starting a Scenic Railroad Service (思维乱搞)
给你n个区间,求: 1:最多有多少区间与同一个区间相交. 2:相交部分的最大区间数目. Sample Input 1 4 1 3 1 3 3 6 3 6 Sample Output 1 2 2 Sam ...
- POJ:2777-Count Color(线段树+状压)
Count Color Time Limit: 1000MS Memory Limit: 65536K Description Chosen Problem Solving and Program d ...