实习日记(5-20)cJSON

小记

笔记

cJSON是啥

cJSON是一种JSON解析,轻量级

cJSON函数
cJSON_Parse

作用:将一个JSON字符串,按照cJSON结构体的结构序列化整个数据包,并在堆中开辟一块内存存储cJSON结构体。

返回值:成功返回一个指向内存块中的cJSON的指针,失败返回NULL。

cJSON_Delete

作用:释放位于堆中cJSON结构体内存。

返回值:无

注意:在使用cJSON_Parse()获取cJSON指针后,若不再使用了,则需要调用cJSON_Delete()对其释放,否则会导致内存泄漏。

cJSON_Print

作用:将cJSON数据解析成JSON字符串,并在堆中开辟一块char*的内存空间存储JSON字符串。cJSON_PrintUnformatted()与cJSON_Print()类似,只是打印输出不带格式,而只是一个字符串数据。

返回值:成功返回一个char*指针该指针指向位于堆中JSON字符串,失败返回NULL。

注意:通过cJSON_Print()可以将cJSON链表中所有的cJSON对象打印出来,但是需要手动去释放对应的资源:free(char *)。

cJSON_PrintUnformatted

作用:无格式打印方式打印

cJSON_GetObjectItem

作用:从object的cJSON链中寻找key为string的cJSON对象。

返回值:成功返回一个指向cJSON类型的结构体指针,失败返回NULL。

简单应用一下
#include<stdio.h>
#include"cJSON.h"
#include <stdlib.h>

/*
{
  "interface": "/dev/ttyS0",
  "speed": 9600,
  "parity": "N",
  "databits": 8,
  "stopbits": 1,
  "interval": 1000,
  "delay": 2,
  "dervices": []
}
*/
int main(){
    //模拟前台传参
    char interface[]="/dev/ttyS0";
    int speed=9600;
    char parity[]="N";
    int databits=8;
    int stopbits=1;
    int interval=1000;
    int delay=2;


    char *cjson_str = NULL;
    cJSON * target=cJSON_CreateObject();
    cJSON * devices = cJSON_CreateArray();
    cJSON_AddItemToObject(target,"interface",cJSON_CreateString(interface));
    cJSON_AddItemToObject(target,"speed",cJSON_CreateNumber(speed));
    cJSON_AddStringToObject(target,"parity",parity);
    cJSON_AddNumberToObject(target,"databits",databits);
    cJSON_AddNumberToObject(target,"stopbits",stopbits);
    cJSON_AddNumberToObject(target,"interval",interval);
    cJSON_AddNumberToObject(target,"delay",delay);
    cJSON_AddItemToObject(target,"dervices",devices);
    cjson_str = cJSON_Print(target);
    printf("%s\n",cjson_str);
}

输出:
在这里插入图片描述然后将字符串写入target.json文件

    FILE *fd=NULL;
    fd=fopen("target.json","w+");
    fprintf(fd, "This is testing for fprintf...\n");
    fputs(cjson_str, fd);

在这里插入图片描述
这里有讲c对文件的读写操作的教程:
https://www.runoob.com/cprogramming/c-file-io.html

再实现从target.json中讲json数据提取出来:

//这是以字符串数组的方式提取
    char buf[255];
    FILE *fd=NULL;
    fd=fopen("target.json","r+");
    while(fgets(buf,1024,fd)!=NULL){
        printf("%s",buf);
    }
    printf("\n");

在这里插入图片描述

//尝试了一下用字符数组提取
void read(){
    char * r[1000];
    char buf;
    FILE *fd=NULL;
    int len;
    int i=0;
    fd=fopen("target.json","r+");
    //while(fgets(buf,1024,fd)!=NULL){
    while(!feof(fd)){
        fscanf(fd, "%c", &buf);
        printf("%c",buf);
        if(i==4){
            break;
        }
        i++;
        //break;
        //r[i]=buf;
        //printf("%d\n",i);
        //i++;
    }
    // for(int i=0;i<sizeof(r);i++){
    //     printf("%s",r[i]);
    // }
    printf("\n");
}

这里我提取了前五个字符:
在这里插入图片描述

fopen和open的区别

https://www.cnblogs.com/hnrainll/archive/2011/08/16/2141365.html
open 是系统调用 返回的是文件句柄,文件的句柄是文件在文件描述副表里的索引,fopen是C的库函数,返回的是一个指向文件结构的指针。
fopen的实现要调用open。

1.fread是带缓冲的,read不带缓冲.
2.fopen是标准c里定义的,open是POSIX中定义的.
3.fread可以读一个结构.read在linux/unix中读二进制与普通文件没有区别.
4.fopen不能指定要创建文件的权限.open可以指定权限.
5.fopen返回指针,open返回文件描述符(整数).

C语言中int转char、char转int、字符拼接
    for(int i=1000;i<=1003;i++){
        char string[23];
        char *json=".json";
        char name[80];
        //这里将int类型的i转化成了字符类型的string
        sprintf(string,"%d",i);
        //这里将字符类型的string和json拼接成一个字符型name
        sprintf(name,"%s%s",string,json);
        printf("%s\n",name);
        break;
    }

输出结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值