C语⾔项⽬中cjson格式字符串构建与解析(新⼿应⽤篇)
C语⾔项⽬中cjson格式字符串构建与解析
本⼈在作为新⼿学习cjson格式字符串使⽤的时候,感觉查阅⽹上资料和各个博客的介绍对新⼈很不友好,所以我在学习了cjson的简单⽤法之后,想作⼀个总结。(本⽂忽略cjson的各种定义概念。这⾥的cjson格式框架,仅供新⼿学习,多层嵌套请移步⼤神博客)
⼀、cjson格式⽤来⼲嘛的
传输⼀个(字符串)⽂本,并且告诉接收⽅,这个⽂本⾥有什么的数据,数据是什么类型,并且能够获取这个数据。
例⼦:我传输⼀个int a,⼀个char b[20]给你,我需要告知你,a的值,b的字符串,所以可以选择⽤cjson格式来传输。
为什么要⽤cjson?
答:cjson传输准确,⽽且是别⼈已经写好了的⼀种⽅式,不需要⾃⼰再写⼀种格式(⾃⼰再定义⼀种传输格式不见得⽐直接运⽤cjson格式⼯作量⼩)。其次是容易修改(包括增加、删除)传输内容。
⼆、cjson格式⽂本
注:传输的cjson格式⽂本,本质上就是字符串。
例⼦:上述传输a,b的例⼦中,⽣成的cjson格式字符串⽂本就可以是这样:
{
"a": 5,
"b": "Hello World!"
}
意思就是,我给你传输⼀个上述的⽂本,这个⽂本⾥包含接收⽅需要的a,b。
三、cjson格式⽂本怎么构建?
(前提:⽹上查cjson.h和cjson.c⽂件,⽂件已经写好了⽣成、解析所需要⽤到的函数。)
如上述例⼦:
void cJSON_Printing()
{
int a = 5;
char b[] = "Hello World!";
cJSON *root = cJSON_CreateObject();
cJSON_AddNumberToObject(root,"a",a);      //将整型数据a放⼊⽂本中(该函数存在于cjson.c中,下函数同理)
cJSON_AddStringToObject(root,"b",b);      //将字符串数据b放⼊⽂本中
//......后续可以通过同样的⽅式继续添加
char *out = cJSON_Print(root);
cJSON_Delete(root);                        //建⽴的cJSON必须Delete,否则会占⽤内存
printf("%s\n",out);
free(out);                                //cJSON_Print会动态分配内存,所以需要释放
//如果⽣成的⽂本需要返回地址,则free(out)去掉,然后记得在函数外部释放“返回地址”的内存
}
该代码则会⽣成“⼆”中的字符串⽂本
四、cjson格式⽂本怎么解析?
如“三”中⽣成的⽂本,通过传输后,假设存放在char *buf指向的地址中
int a;
char b[100];
void cJSON_Parsing(char *buf)
{
cJSON *root = cJSON_Parse(buf);
if(!root)                        //⼀定要判断是否解析出cjson格式,否则后续解析会导致系统崩掉
{
printf("Error in cjosn: [%s]\n",cJSON_GetErrorPtr());
}
else
{
cJSON *temp = cJSON_GetObjectItem(root,"a");            //获取cjson⽂本中的a
if(temp != NULL)              //此判断和后续的判断都是必要的,以免解析导致系统崩掉
{
if(temp->type == cJSON_Number)          //若获取的a是“数”
{
a = temp->valueint;                              //若已知是整型,则获取整型数据,若是双精浮点型数据,则⽤valuedoule
}
}
temp = cJSON_GetObjectItem(root,"b");
if(temp != NULL)
{
if(temp->type == cJSON_String)          //若获取的b是“字符串”
{
strcpy(b, temp->valuestring);
}
}
}
cJSON_Delete(root);          //记得需要释放root分配的内存
}
这样就得到cjson格式的⽂本数据了。
五、数组构建(⼩进阶)
1、整型数组
void cJSON_Printing()
{
int a[10] = {0,1,2,3,4,5,6,7,8,9};
cJSON *root = cJSON_CreateObject();
cJSON_AddItemToObject(root,"a",cJSON_CreateIntArray(a,10));          //注
c++strcpy函数用法
char *out = cJSON_Print(root);
cJSON_Delete(root);
printf("%s\n",out);
free(out);
}
//打印结果
{
"a": [0,1,2,3,4,5,6,7,8,9]
}
(浮点数组理应修改“注”中的cJSON_CreateIntArray函数,读者可⾃⾏查看,在此不在赘述。)
2、字符串数组
我发现查阅的资料都太跳跃,所以说对新⼿不友好,所以我⾃⼰试出了可⽤的cjson字符串数组构建。(不知道为什么,像整型数组那样直接⼀句代码构建,我没有成功)
void cSJON_Printing()
{
char b[5][5] = {"ab","cd","ef","gh","ij"};
cJSON *root = cJSON_CreateObject();
cJSON *b_array = cJSON_CreateArray();      //创建⼀个cjson数组
cJSON *temp;
int i;
for(i=0;i<5;i++)
{
temp = cJSON_CreateString(b[i]);  //将每个字符串传⾄cjson格式的temp中(即temp是每个字符串的cjson格式)        cJSON_AddItemToArray(b_array,temp);    //将每个temp放⼊cjson数组中
}
cJSON_AddItemToObject(root,"b",b_array);    //将⽣成好的数组放⼊root中
char *out = cJSON_Print(root);
cJSON_Delete(root);
printf("%s\n",out);
free(out);
}
//打印结果
{
"b": ["ab","cd","ef","gh","ij"]
}
注:该⽅法也能应⽤于整型数组的构建。
多层嵌套请移步⼤神博客。
阿猪⽶德
2019.07.04于湖北武汉

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。