JSON

Json学习--简单创建

字号+ 作者:H5之家 来源:H5之家 2017-01-12 17:02 我要评论( )

Json学习--简单创建 Json学习三、创建Json式;还是在Linux下,使用C语言编程,先实现写文件的功能,然后开始josn字符串的创建。我们还是一步步来,先从简单的开始。 1,创建简化版的一句话;首先是一个简单的键对字符串,要生成的目标如下: {"firstName":"B

Json学习--简单创建

Json学习三、创建Json格式;还是在Linux下,使用C语言编程,先实现写文件的功能,然后开始josn字符串的创建。我们还是一步步来,先从简单的开始。

1,创建简化版的一句话; 首先是一个简单的键值对字符串,要生成的目标如下:

{"firstName":"Brett"}

相比于解析,此时是创建,依据键值的定义(firstName)以及初始值(Brett),需要生成符合Json标准的字符串。

2,创建结构体的Json串; 此时,我们是先有结构体,后来实现Json中的对象。结构体如下:

typedef struct

{

char firstName[32];

char lastName[32];

char email[64];

int age;

float height;

}people;

对于结构体中的每一个成员,先要定义好key,然后取值转换为相应字符串。

在这里,我们需要判断这个结构体的最后一个成员的处理,即在最后一个键值对之后,应该是“,”还是“}”,需要能区分清楚。

3,创建结构体数组的Json串; 由于前面已经实现了从结构体创建Json串,此时只需要添加数组的架构,并多次进行结构体的创建即可。

此时,Json串的内容已经比较多了,如何没有换行,则长长的一行,会让人看得迷迷糊糊的,可读性不好。我们可以调整下格式,让Json串变得更有条理一些:既然已知是结构体数组,那么,分层结构也是比较清晰的,即内部是结构体,再外层是数组。考虑到结构体内容并不多,可以简单的将每个结构体的内容展示在一行中,而对于数组的形式也增加一个换行,格式如下,这样就清晰多了:

{

"people":[

{"firstName":"z","lastName":"Jason","email":"bbbb@126.com","height":1.67},

{"lastName":"jadena","email":"aaaa@126.com","age":8,"height":1.17},

{"email":"cccc@126.com","firstName":"z","lastName":"Juliet","age":36,"height":1.55}

]

}

当然,还可以调整得更好,例如每行只存储一个键值对,每行有缩进,缩进的宽度,又与所处层次有关,不过那就是下一步的事情了,呵呵。

4,复杂的嵌套结构,如何实现?若存在结构体中包含数组,数组中包含结构体,多层嵌套,如何创建Json串?

不管多复杂的嵌套结构,只要明确下来了,然后就可以定义一个协议,即键值对的定义,然后逐层转换即可。

从这里的分析,对比之前做解析时的分析,就可以知道,其实创建Json串比解析要简单!创建json格式时,不用考虑那么多异常情况的处理,只是按照一种符合标准的写法实现出来即可。当然,这里的简单,是说逻辑上,以及代码实现上简单。这种实现方案,还是按照定制的消息接口协议进行的,实现代码与协议密切相关,没有将Json规则独立出来。

如果要将Json规则独立出来,以实现Json字符串的创建的统一接口,那么,结构体与数组的嵌套,必然是需要递归调用才能实现的,这种逻辑也是比较复杂的了。

说明:本文所附带例程,只是一个学习之作,对于初学Json的同学,可以有些借鉴参考的作用。但是,对于异常处理、字符串中的特殊字符的处理等,都不完善,创建Json字符串的方法也不是一个通用的接口,只能根据具体的协议,来定制相应的创建函数,在使用时要求编程者对Json格式非常了解,所以,并不是很适用于软件工程开发中。

真正用于软件工程开发中的Json接口,C语言版本的大家可以参考CJSON,下载地址为。至于其他语言的,可以到
中去寻找相应的实现。



附带例程:#include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #define PRINT(msg...) do {printf("lintax: "); printf(msg);}while(0) typedef struct { int id; char firstName[32]; char lastName[32]; char email[64]; int age; float height; }people; //create json string int produce_str_value_in_json(char * json_str, int str_len, char * str_key, char * str_value) { int pos_str=0; if ( (json_str==NULL)||(str_key==NULL)||(str_value==NULL)) { PRINT("input str is NULL\n"); return -1; } if(str_len<=0) { PRINT("input param is invalid: str_len=%d\n",str_len); return -1; } if(str_key[0]==0) { PRINT("input key is invalid\n"); return -1; } //str_len, is overflow ? int len_add=strlen(str_key)+strlen(str_value)+5; //PRINT("%s:str_len=%d, len_add=%d\n",__func__,str_len,len_add); if(len_add>=str_len) { PRINT("error: input str len is too small: str_len=%d\n",str_len); return -1; } sprintf(json_str+pos_str, "\"%s\":\"%s\"",str_key,str_value); PRINT("%s,json_str:%s\n",__func__,json_str); return len_add; } int produce_int_value_in_json(char * json_str, int str_len, char * str_key, int value) { int pos_str=0; if ( (json_str==NULL)||(str_key==NULL)) { PRINT("input str is NULL\n"); return -1; } if(str_len<=0) { PRINT("input param is invalid: str_len=%d\n",str_len); return -1; } if(str_key[0]==0) { PRINT("input key is invalid\n"); return -1; } //str_len, is overflow ? char str_add[128]={0}; int len_add=0; sprintf(str_add, "\"%s\":%d",str_key,value); len_add=strlen(str_add); //PRINT("%s:str_len=%d, len_add=%d\n",__func__,str_len,len_add); if(len_add>=str_len) { PRINT("error: input str len is too small: str_len=%d\n",str_len); return -1; } sprintf(json_str+pos_str, "%s",str_add); PRINT("%s,json_str:%s\n",__func__,json_str); return len_add; } int produce_float_value_in_json(char * json_str, int str_len, char * str_key, float value) { int pos_str=0; if ( (json_str==NULL)||(str_key==NULL)) { PRINT("input str is NULL\n"); return -1; } if(str_len<=0) { PRINT("input param is invalid: str_len=%d\n",str_len); return -1; } if(str_key[0]==0) { PRINT("input key is invalid\n"); return -1; } //str_len, is overflow ? char str_add[128]={0}; int len_add=0; sprintf(str_add, "\"%s\":%.02f",str_key,value); len_add=strlen(str_add); //PRINT("%s:str_len=%d, len_add=%d\n",__func__,str_len,len_add); if(len_add>=str_len) { PRINT("error: input str len is too small: str_len=%d\n",str_len); return -1; } sprintf(json_str+pos_str, "%s",str_add); PRINT("%s,json_str:%s\n",__func__,json_str); return len_add; } int main(int argc, char **argv) { int ret=-1, i; char str_create[4096]={0};//, buf[BUFSIZE], int len_str_create=0; int pos,pos_str=0; FILE *fp; char file_path[100]; people workers[10]={ {0,"z","Jason","bbbb@126.com",0,1.67}, {1,"","jadena","aaaa@126.com",8,1.17}, {2,"z","Juliet","cccc@126.com",36,1.55} }; //create json string printf("\nto create json string:\n"); int str_len=sizeof(str_create); pos_str=0; if ( str_create==NULL) { return -1; } sprintf(str_create+pos_str, "{");//the json string start pos_str++; char str_add[128]={0}; int len_add=0; sprintf(str_add, "\"people\":[\n");//the array start len_add=strlen(str_add); sprintf(str_create+pos_str, "%s",str_add); pos_str+=len_add; for(i=0;i<3;i++) { if(i>0) { sprintf(str_create+pos_str, ",\n");//between two structs pos_str+=2; } sprintf(str_create+pos_str, "{");//the struct start pos_str++; pos=produce_str_value_in_json(str_create+pos_str, str_len-pos_str, "firstName", workers[i].firstName); //PRINT("produce_str_value_in_json firstName pos=%d\n",pos); if(pos<0) { PRINT("produce_str_value_in_json ret failed\n"); return -1; } pos_str+=pos; sprintf(str_create+pos_str, ",");//between two struct members pos_str++; pos=produce_str_value_in_json(str_create+pos_str, str_len-pos_str, "lastName", workers[i].lastName); //PRINT("produce_str_value_in_json lastName pos=%d\n",pos); if(pos<0) { PRINT("produce_str_value_in_json ret failed\n"); return -1; } pos_str+=pos; sprintf(str_create+pos_str, ",");//between two struct members pos_str++; pos=produce_str_value_in_json(str_create+pos_str, str_len-pos_str, "email", workers[i].email); //PRINT("produce_str_value_in_json email pos=%d\n",pos); if(pos<0) { PRINT("produce_str_value_in_json ret failed\n"); return -1; } pos_str+=pos; sprintf(str_create+pos_str, ",");//between two struct members pos_str++; pos=produce_int_value_in_json(str_create+pos_str, str_len-pos_str, "age", workers[i].age); //PRINT("produce_str_value_in_json age pos=%d\n",pos); if(pos<0) { PRINT("produce_str_value_in_json ret failed\n"); return -1; } pos_str+=pos; sprintf(str_create+pos_str, ",");//between two struct members pos_str++; pos=produce_float_value_in_json(str_create+pos_str, str_len-pos_str, "height", workers[i].height); //PRINT("produce_str_value_in_json height pos=%d\n",pos); if(pos<0) { PRINT("produce_str_value_in_json ret failed\n"); return -1; } pos_str+=pos; sprintf(str_create+pos_str, "}");//the struct end pos_str++; } sprintf(str_create+pos_str, "\n]");//the array end pos_str+=2; sprintf(str_create+pos_str, "}");//the json string end pos_str++; len_str_create=pos_str; if(len_str_create<0) { PRINT("create_json_str ret failed\n"); return -1; } else { PRINT("create_json_str ret %s\n",str_create); } //write file sprintf(file_path,"json_str_create.txt"); fp = fopen(file_path, "w"); if (NULL == fp) { printf("open file %s fail : %m.\n", file_path); return ret; } ret=fwrite(str_create,len_str_create,1,fp); /* 一次性读取全部文件内?*/ /**/ fclose(fp); return 0; }

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • json相关知识介绍

    json相关知识介绍

    2017-01-12 18:00

  • Spring学习(3)

    Spring学习(3)

    2017-01-10 11:00

  • jquery利用json实现页面之间传值的实例解析

    jquery利用json实现页面之间传值的实例解析

    2017-01-10 10:04

  • JAVA 根据数据库表内容生产树结构JSON数据

    JAVA 根据数据库表内容生产树结构JSON数据

    2017-01-10 08:07

网友点评