开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第24天,点击查看活动详情
前言
上篇简单介绍了对Json格式的读取和解析,常用来配置文件的使用需求中。
当然配置文件存在修改的需求,所以本节讲一下生成Json格式数据,并保存本地。
接口介绍
cJSON_Print:打印一个json树的字符串表达方式。
cJSON_PrintUnformatted:打印Json字符串,不过不带换行空格之类的格式化符号
cJSON_PrintBuffered:携带一个申请空间大小的参数。
cJSON_PrintPreallocated:如果你有频繁打印的需求,最好用这个接口,避免库内部申请空间,效率更好一点。
cJSON_CreateObject:用于创建一个节点,可以理解成上文讲的 `{}`
cJSON_CreateObject 效果如下
cJSON_CreateArray:创建是数组类型的对象
cJSON_Add****ToObject:把null/数字/字符串/数组/对象添加到一个对象中
cJSON_AddItemToArray:把一个节点数组添加到一个数组中
cJSON_AddItemToObject:把一个节点数组添加到一个对象中
cJSON_Create****Array:创建 整数/浮点型/字符串类型的数组对象
接口使用
以上接口可用来实现配置文件的生成了。 基本能满足我们对写入Json的需求了。 现在写入一个文件 本地文件名:z.cfg。 json结构包含两个键值对,其中一个值是数组,一个值是字符串。
代码实例如下:
#include<stdio.h>
#include <stdlib.h>
#include<unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "cJSON.h"
static char* cfgPath = "./z.cfg";
int main(int argc, char** argv)
{
char *Buf = NULL;
//创建主树对象
cJSON* JsonMain = cJSON_CreateObject();
//填充第一个节点的键值对内容
cJSON_AddItemToObject(JsonMain,"Nm1",cJSON_CreateString("MainTest1"));
//第二个节点,配置成数组类型
cJSON* Cld2Main = cJSON_AddArrayToObject(JsonMain,"Nm2");
//填充数组第一个成员的内容,由四个成员组成
cJSON* Arr1 = cJSON_CreateObject();
cJSON_AddNumberToObject(Arr1,"tm",1111);
cJSON_AddStringToObject(Arr1,"tm","test1");
cJSON_AddStringToObject(Arr1,"qua","num1");
cJSON_AddNumberToObject(Arr1,"val",1.1);
//填充数组第二个成员的内容,由四个成员组成
cJSON* Arr2 = cJSON_CreateObject();
cJSON_AddNumberToObject(Arr2,"tm",1111);
cJSON_AddStringToObject(Arr2,"tm","test1");
cJSON_AddStringToObject(Arr2,"qua","num1");
cJSON_AddNumberToObject(Arr2,"val",1.1);
//填充数组第三个成员的内容,由四个成员组成
cJSON* Arr3 = cJSON_CreateObject();
cJSON_AddNumberToObject(Arr3,"tm",1111);
cJSON_AddStringToObject(Arr3,"tm","test1");
cJSON_AddStringToObject(Arr3,"qua","num1");
cJSON_AddNumberToObject(Arr3,"val",1.1);
//分别把三个成员添加到数组句柄中去
cJSON_AddItemToArray(Cld2Main,Arr1);
cJSON_AddItemToArray(Cld2Main,Arr2);
cJSON_AddItemToArray(Cld2Main,Arr3);
//打印Json字符串,并写入到本地文件
Buf = cJSON_Print(JsonMain);
int bfd = open(cfgPath,O_RDWR|O_CREAT);
write(bfd,Buf,strlen(Buf));
fprintf(stdout,"\t\t\t\t write json Buf:\n%s\n",Buf);
//释放成员申请的系统资源
close(bfd);
free(Buf);
cJSON_Delete(JsonMain);
return 0;
}
测试结果,可以看出来携带格式化,可以很清晰明白的了解整个Json树:
生成的文件:
本文章就写到这里,重新创建文件,可以减少一下往期文件内容对于此次文件操作的影响,一切从新开始写入。