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

 1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
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 int i;
58 for(i=0;i<size;i++)
59 {
60 tnode = cJSON_GetArrayItem(node,i);
61 if(tnode->type == 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进行深入的学习,学无止境,我这里就介绍到这里了。

转自:http://www.cnblogs.com/liunianshiwei/p/6087596.html

JSON的简单介绍以及C语言的JSON库使用的更多相关文章

  1. 腾讯云数据库团队:MySQL5.7 JSON实现简单介绍

    作者介绍:吴双桥 腾讯云project师 阅读原文.很多其它技术干货.请訪问fromSource=gwzcw.57435.57435.57435">腾云阁. 本文主要介绍在MySQL ...

  2. json-lib简单处理json和对json的简单介绍

    JSON 1.json是什么? *它是js提供的一种数据交换格式 2.json的语法 *{}:是对象! >属性名必须使用双引号括起来!单引号不行!!! >属性值: *null *数值 *数 ...

  3. Json的简单介绍和解析

    Json:JavaScript对象表示法(JavaScript Object Noatation) Json是存储和交换文本信息的语法,类似XML.它采用键值对的方式来组织,易于人们阅读和编写,同时也 ...

  4. 原生ajax接收json字符串(简单介绍)

    什么是json? JSON的全称是 Javascript Object Notation(javascript对象表示法),是基于javascript对象字面量,如果单从眼睛看,JSON里的数据是被保 ...

  5. JSON的简单使用_向前台发送JSON数据

    转自:http://www.cnblogs.com/digdeep/p/5574366.html 1.前台页面 <%@ page language="java" conten ...

  6. package.json参数简单介绍

    概述: 每个项目的根目录下都会有一个package.json文件,定义了项目所需的模块,以及项目信息.执行npm install 命令会自动下载package.json中配置的模块,也就是配置项目的运 ...

  7. JSON基础,简单介绍

    JSON(JavaScript Object Notation(记号.标记)) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - ...

  8. Python常用的库简单介绍一下

    Python常用的库简单介绍一下fuzzywuzzy ,字符串模糊匹配. esmre ,正则表达式的加速器. colorama 主要用来给文本添加各种颜色,并且非常简单易用. Prettytable ...

  9. Python的简单介绍

    0. 前言 最近在从头梳理Python的相关知识,有助于以后更好地学习新知识.这篇博客,我简单介绍一下Python语言的有关内容. 1. Python介绍 Python的创始人为荷兰人吉多·范罗苏姆( ...

随机推荐

  1. The superclass "javax.servlet.http.HttpServlet" was not found 问题解决

    项目中报" The superclass "javax.servlet.http.HttpServlet" was not found "这个错误,是因为缺少t ...

  2. Atitit 图像处理 halcon类库的使用  范例边缘检测 attilax总结

    Atitit 图像处理 halcon类库的使用  范例边缘检测 attilax总结 1.1. 安装halcon11 ..体积大概1g压缩模式1 1.2. Halcon的科技树1 1.3. 启动 &qu ...

  3. innobackupex在线备份及恢复(全量和增量)

    Xtrabackup是由percona开发的一个开源软件,它是innodb热备工具ibbackup(收费的商业软件)的一个开源替代品.Xtrabackup由个部分组成:xtrabackup和innob ...

  4. C++11 STL算法简介

    STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库.它被容纳于C++标准程序库(C++ Standard Library)中,是ANS ...

  5. 【Android】事件输入系统-代码层次解读

    本文基于Android-4.0 理论层次解读 请看:www.cnblogs.com/lcw/p/3373214.html 如何管理各种驱动设备 在理论中谈到EventHub,这个一看就是一个做实事的, ...

  6. js如何获取前后连续n天的时间

    function GetDateStr(AddDayCount) { var dd = new Date(); dd.setDate(dd.getDate()+AddDayCount);//获取Add ...

  7. Java类的成员初始化顺序

    Java类的成员初始化顺序 2017-06-01 代码: public class InitializeSequence { public static void main(String[] args ...

  8. js随机生成一个数组中的随机字符串以及更新验证码

    随机生成m,n范围的值得公式: Math.random()*(n-m)+m: 改正公式:Math.random()*(n+1-m)+m // 生成随机字符串function randomMixed(n ...

  9. LeetCode: Pow(x, n) 解题报告

    Pow(x, n) Implement pow(x, n). SOLUTION 1: 使用二分法. 1. 负数的情况,使用以下的公式转化为求正数power,另外,考虑到MIN_VALUE可能会造成越界 ...

  10. maven 远程仓库的配置

      setting.xml    <profile> <id>development</id> <repositories> <repositor ...