JSON概述

JSON: JavaScript 对象表示法( JavaScript Object Notation) 。是一种轻量级的数据交换格式。 它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式, 但是也使用了类似于C语言家族的习惯( 包括C、 C++、 C#、 Java、 JavaScript、 Perl、 Python等) 。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写, 同时也易于机器解析和生成(一般用于提升网络传输速率)。

JSON 解析器和 JSON 库支持许多不同的编程语言。 JSON 文本格式在语法上与创建 JavaScript 对象的代码相同。 由于这种相似性, 无需解析器, JavaScript 程序能够使用内建的 eval() 函数, 用 JSON 数据来生成原生的 JavaScript 对象。

JSON 是存储和交换文本信息的语法。 类似 XML。 JSON 比 XML 更小、 更快, 更易解析。

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

2 #include

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

2 #include

3 #include

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

2 #include

3 #include

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

2 #include

3 #include

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如下:

1 #include

2 #include

3 #include

4 #include"cJSON.h"

5

6 int main(void)7 {8 char *string = "{\"family\":[\"father\",\"mother\",\"brother\",\"sister\",\"somebody\"]}";9 //从缓冲区中解析出JSON结构

10 cJSON *json = cJSON_Parse(string);11 cJSON *node =NULL;12 //cJOSN_GetObjectItem 根据key来查找json节点 若果有返回非空

13 node = cJSON_GetObjectItem(json,"family");14 if(node ==NULL)15 {16 printf("family node == NULL\n");17 }18 else

19 {20 printf("found family node\n");21 }22 node = cJSON_GetObjectItem(json,"famil");23 if(node ==NULL)24 {25 printf("famil node == NULL\n");26 }27 else

28 {29 printf("found famil node\n");30 }31 //判断是否有key是string的项 如果有返回1 否则返回0

32 if(1 == cJSON_HasObjectItem(json,"family"))33 {34 printf("found family node\n");35 }36 else

37 {38 printf("not found family node\n");39 }40 if(1 == cJSON_HasObjectItem(json,"famil"))41 {42 printf("found famil node\n");43 }44 else

45 {46 printf("not found famil node\n");47 }48

49 node = cJSON_GetObjectItem(json,"family");50 if(node->type ==cJSON_Array)51 {52 printf("array size is %d",cJSON_GetArraySize(node));53 }54 //非array类型的node 被当做array获取size的大小是未定义的行为 不要使用

55 cJSON *tnode =NULL;56 int size =cJSON_GetArraySize(node);57 inti;58 for(i=0;itype ==cJSON_String)62 {63 printf("value[%d]:%s\n",i,tnode->valuestring);64 }65 else

66 {67 printf("node' type is not string\n");68 }69 }70

71 cJSON_ArrayForEach(tnode,node)72 {73 if(tnode->type ==cJSON_String)74 {75 printf("int forEach: vale:%s\n",tnode->valuestring);76 }77 else

78 {79 printf("node's type is not string\n");80 }81 }82 return 0;83 }

编译程序,执行程序,解析出json信息如下图所示,

关于更多的json学习,可以自己根据提供的cJSON.h cJSON.c进行深入的学习,学无止境,我这里就介绍到这里了。

c语言 json 请求_JSON的简单介绍以及C语言的JSON库使用相关推荐

  1. HTTP请求方式中8种请求方法(简单介绍)

    HTTP请求方式中8种请求方法(简单介绍) 简单介绍 HTTP是超文本传输协议,其定义了客户端与服务器端之间文本传输的规范.HTTP默认使用80端口,这个端口指的是服务端的端口,而客户端使用的端口是动 ...

  2. JSON的简单介绍以及C语言的JSON库使用

    本文转自:https://www.cnblogs.com/liunianshiwei/p/6087596.html JSON概述 JSON: JavaScript 对象表示法( JavaScript ...

  3. MySQL笔记之MySQL简单介绍及DQL语言

    MySQL介绍 MySQL服务的启动和停止: 方式一:通过命令行 net start 服务名 net stop 服务名 MySQL服务的登录和退出: 登录:mysql [ -h 主机名 -p 端口号 ...

  4. C语言——函数和数组的简单介绍

    本人声明:小编是一个刚学c语言不久的小白,想要写博客来加深对知识的理解,如果有写得不对或者不好的地方请各位大佬多多指教! 目录 (1)函数的概念 (2)函数的定义 (3)函数的调用 (4)使用函数和不 ...

  5. html 怎么使用http请求数据类型,HTTP请求方式中8种请求方法(简单介绍)

    HTTP工作原理 HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端.HTTP协议采用了请求/响应模型.客户端向服务器发送一个请求报文,请求报文包含请 ...

  6. R语言与数据分析:时间序列简单介绍

    1. https://blog.csdn.net/howardge/article/details/41979119 接下来我们来分解时间序列,时间序列分为:非季节性数据和季节性数据 一个非季节性时间 ...

  7. C语言的VC开发环境界面介绍,【c语言在vc++6.0中编写界面程序】

    到现在为止,C++ 仍然是计算机编程领域的经典语言之一,C++ 17 标准在2017上半年已经探讨确定.本期我们汇集了编程专家--祁宇(<深入应用 C++ 11>作者,C++ 开源社区 p ...

  8. php语言cookie,如何创建一个简单的PHP cookie语言切换?

    感谢所有的建议 – @Mob让我朝着正确的方向前进,即在另一页上处理cookie,然后将你送回第一页. 我做了一些思考和实验,我终于解决了它.我会发布下面的代码,其他任何人都想使用它. 在您的主页上放 ...

  9. python量化常用_简单介绍下量化分析的常用库TA-lib

    做python量化交易,尤其是做趋势跟踪的或者是K线指标分析跟踪的,TA-lib库基本都多多少少用到,搜索时候往往搜出来"塔利班",所以玩笑塔利班库.尤其对于从传统K线技术分析转计 ...

最新文章

  1. python爬虫可以爬哪些山_从python爬虫,到更爱这个世界
  2. 在读博士生 2 年实现 Nature、Science 双发,他来自这所高校!
  3. 自学java 第十章内部类(二)
  4. html5游戏制作入门系列教程(四)
  5. Zabbix触发器配置指定生效星期监控CPU使用率
  6. LabelImg使用方法
  7. Linux系统中PostgreSQL客户端的安装
  8. 区块链入门导航-磨链社区
  9. struck的用法c语言,求struck结构体定义和赋值的具体讲解
  10. 携程日处理20亿数据,实时用户行为服务系统架构实践
  11. 华芯微特SWM181学习笔记--GPIO应用与环境搭建
  12. HCTF 2017 bin Level1 Evr_Q Writeup
  13. 中关村e谷为产业搭台:中关村论坛(空天专场)黑科技亮相现场
  14. KMS工具激活office2016报错0x80080005的解决记录
  15. 创成汇:还在担心手机没电?共享充电让你不再焦虑!
  16. 设计模式全解析(一)——带你搞懂设计模式
  17. 把Excel里的url链接转换为图片显示
  18. “昆明城市咖啡地图”活动再度开启
  19. [LOJ2422]【NOIP2015】斗地主
  20. 哈哈,又找到几个强大的html5+css3的动画效果

热门文章

  1. 【Python】random.randint()用法
  2. 裸金属服务器租用常见问题
  3. 耶鲁大学 博弈论(Game Theory) 笔记6-纳什均衡之纳什均衡之伯川德模型与选民投票
  4. Spline算法实现
  5. 小白也能做的选择(上)
  6. 【FPGA】多功能ALU
  7. 【机器学习】如何成为当下合格的算法工程师
  8. 计算机领域的所有SCI一区期刊,这是最顶级期刊了
  9. python+selenium爬虫,使用selenium爬取热门微博数据
  10. 数据库周刊36丨2020年8月数据库排行;云厂商腾讯云增速第一;OceanBase集群安装;Oracle RAC调整网卡MTU值;不改代码解决sql性能问题;Mysql索引研究;TiDB电子书……