cJson 写相关接口的使用

143 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第24天,点击查看活动详情

前言

上篇简单介绍了对Json格式的读取和解析,常用来配置文件的使用需求中。
当然配置文件存在修改的需求,所以本节讲一下生成Json格式数据,并保存本地。

接口介绍

cJSON_Print:打印一个json树的字符串表达方式。
cJSON_PrintUnformatted:打印Json字符串,不过不带换行空格之类的格式化符号
cJSON_PrintBuffered:携带一个申请空间大小的参数。
cJSON_PrintPreallocated:如果你有频繁打印的需求,最好用这个接口,避免库内部申请空间,效率更好一点。
cJSON_CreateObject:用于创建一个节点,可以理解成上文讲的 `{}`

cJSON_CreateObject 效果如下

image.png

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树:

image.png

生成的文件: image.png

本文章就写到这里,重新创建文件,可以减少一下往期文件内容对于此次文件操作的影响,一切从新开始写入。