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列をより筋道立ててフォーマットを調整することができます.構造体配列が知られている以上、階層構造もはっきりしています.すなわち、内部は構造体であり、外層は配列です.構造体の内容がそれほど多くないことを考慮すると、各構造体の内容を簡単に1行に表示することができ、配列の形式に対しても改行を追加し、フォーマットは以下のように明確になります.
{
"people":[
{"firstName":"z","lastName":"Jason","email":"[email protected]","height":1.67},
{"lastName":"jadena","email":"[email protected]","age":8,"height":1.17},
{"email":"[email protected]","firstName":"z","lastName":"Juliet","age":36,"height":1.55}
]
}
もちろん、各行に1つのキー値ペアしか格納されず、各行にインデント、インデントの幅があり、階層に関係しているように調整することもできますが、それは次のステップです.ほほほ.
4、複雑なネスト構造、どのように実現しますか?
構造体に配列、配列に構造体、多層ネストがある場合、Json列を作成するにはどうすればいいですか?
どんなに複雑なネスト構造であっても、明確にすれば、キー値ペアの定義というプロトコルを定義し、階層ごとに変換することができます.
ここからの分析は、前に解析をしたときの分析と比べて、Json列の作成が解析より簡単であることがわかります.jsonフォーマットを作成する場合は,それほど多くの異常を考慮する必要はなく,基準に合致する書き方で実現すればよい.もちろん、ここの簡単さは、論理的にもコード実装的にも簡単です.この実装スキームは,カスタマイズされたメッセージインタフェースプロトコルに従って行われ,実装コードはプロトコルと密接に関連しており,Jsonルールを独立させていない.
Jsonルールを独立してJson文字列の作成のための統一インタフェースを実現する場合、構造体と配列のネストは、必ず再帰呼び出しが必要であり、この論理も複雑である.
説明:
本文の付属するルーチン、ただ1つの学習の作品、初学のJsonの学友に対して、少し参考にする作用があります.しかし,例外処理,文字列中の特殊文字の処理などは不備であり,Json文字列の作成方法も共通のインタフェースではなく,具体的なプロトコルに基づいて対応する作成関数をカスタマイズするしかなく,使用時にプログラミング者にJsonフォーマットをよく知られていないため,ソフトウェアエンジニアリング開発にはあまり適していない.
本当にソフトウェアエンジニアリングの开発の中のJsonインタフェースに用いて、C言语のバージョンのみんなはCJSONを参考にすることができて、住所をダウンロードしますhttp://sourceforge.net/projects/cjson/.他の言語については、http://www.json.org.cn/の中で相応の実現を探します.
付属のインスタンス:
#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
");
return -1;
}
if(str_len<=0)
{
PRINT("input param is invalid: str_len=%d
",str_len);
return -1;
}
if(str_key[0]==0)
{
PRINT("input key is invalid
");
return -1;
}
//str_len, is overflow ?
int len_add=strlen(str_key)+strlen(str_value)+5;
//PRINT("%s:str_len=%d, len_add=%d
",__func__,str_len,len_add);
if(len_add>=str_len)
{
PRINT("error: input str len is too small: str_len=%d
",str_len);
return -1;
}
sprintf(json_str+pos_str, "\"%s\":\"%s\"",str_key,str_value);
PRINT("%s,json_str:%s
",__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
");
return -1;
}
if(str_len<=0)
{
PRINT("input param is invalid: str_len=%d
",str_len);
return -1;
}
if(str_key[0]==0)
{
PRINT("input key is invalid
");
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
",__func__,str_len,len_add);
if(len_add>=str_len)
{
PRINT("error: input str len is too small: str_len=%d
",str_len);
return -1;
}
sprintf(json_str+pos_str, "%s",str_add);
PRINT("%s,json_str:%s
",__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
");
return -1;
}
if(str_len<=0)
{
PRINT("input param is invalid: str_len=%d
",str_len);
return -1;
}
if(str_key[0]==0)
{
PRINT("input key is invalid
");
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
",__func__,str_len,len_add);
if(len_add>=str_len)
{
PRINT("error: input str len is too small: str_len=%d
",str_len);
return -1;
}
sprintf(json_str+pos_str, "%s",str_add);
PRINT("%s,json_str:%s
",__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","[email protected]",0,1.67},
{1,"","jadena","[email protected]",8,1.17},
{2,"z","Juliet","[email protected]",36,1.55}
};
//create json string
printf("
to create json string:
");
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\":[
");//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, ",
");//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
",pos);
if(pos<0)
{
PRINT("produce_str_value_in_json ret failed
");
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
",pos);
if(pos<0)
{
PRINT("produce_str_value_in_json ret failed
");
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
",pos);
if(pos<0)
{
PRINT("produce_str_value_in_json ret failed
");
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
",pos);
if(pos<0)
{
PRINT("produce_str_value_in_json ret failed
");
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
",pos);
if(pos<0)
{
PRINT("produce_str_value_in_json ret failed
");
return -1;
}
pos_str+=pos;
sprintf(str_create+pos_str, "}");//the struct end
pos_str++;
}
sprintf(str_create+pos_str, "
]");//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
");
return -1;
}
else
{
PRINT("create_json_str ret %s
",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.
", file_path);
return ret;
}
ret=fwrite(str_create,len_str_create,1,fp); /* �?*/ /**/
fclose(fp);
return 0;
}