json的简单介绍以及c语言的json库使用-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 845806
  • 博文数量: 286
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1980
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-04 16:41
文章分类

(286)

  • (2)
  • (5)
  • (3)
  • (7)
  • (14)
  • (3)
  • (152)
  • (0)
  • (1)
  • (3)
  • (3)
  • (7)
  • (56)
  • (11)
  • (17)
  • (2)
文章存档

(2)

(5)

(95)

(69)

(15)

(100)

我的朋友
最近访客
相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: web开发

2017-05-04 11:47:10

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库下载地址 

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)

    判断是否有keystring的项 如果有返回否则返回extern int cjson_hasobjectitem(cjson *object,const char *string)
                      { return cjson_getobjectitem(object,string)?1:0; }

    返回数组结点array中成员的个数 :extern int cjson_getarraysize(cjson *array);

    根据数组下标indexarray数组结点的第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<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  2 #include  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  2 #include<string.h>  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<string.h>  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 int i; 58 for(i=0;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进行深入的学习,学无止境,我这里就介绍到这里了。

努力不一定有结果,有结果不一定是努力
阅读(1102) | 评论(0) | 转发(0) |
0

上一篇:

下一篇:

给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图