使用cJSON进行JSON文件读写

推荐cJSON下载地址:

Git地址:https://github.com/arnoldlu/cJSON

可以尝试:sudo apt-get install libcjson-dev,笔者未使用该方式。

百度AI搜索程序,供参考,部分函数名称应以cJSON模块内定义为主

json文件读写

#include <stdio.h>
#include <stdlib.h>
#include "cjson/cJSON.h"void write_json(char *filename) {// 创建一个JSON对象cJSON *json = cJSON_CreateObject();cJSON_AddStringToObject(json, "name", "John Doe");cJSON_AddNumberToObject(json, "age", 30);// 将JSON对象转换成字符串char *json_string = cJSON_Print(json);// 打开文件FILE *file = fopen(filename, "w");if (file) {// 写入JSON字符串到文件fprintf(file, "%s", json_string);fclose(file);}// 清理cJSON_Delete(json);free(json_string);
}cJSON *read_json(char *filename) {// 读取文件内容到字符串FILE *file = fopen(filename, "r");if (file == NULL) {return NULL;}fseek(file, 0, SEEK_END);long length = ftell(file);fseek(file, 0, SEEK_SET);char *data = (char *)malloc(length + 1);fread(data, 1, length, file);data[length] = '\0';fclose(file);// 解析JSON字符串cJSON *json = cJSON_Parse(data);free(data);return json;
}int main() {char *filename = "example.json";// 写入JSON文件write_json(filename);// 读取JSON文件cJSON *json = read_json(filename);if (json) {// 获取并打印JSON字段const cJSON *name = cJSON_GetObjectItemCaseSensitive(json, "name");const cJSON *age = cJSON_GetObjectItemCaseSensitive(json, "age");if (cJSON_IsString(name) && (name->valuestring != NULL) && cJSON_IsNumber(age)) {printf("Name: %s\n", name->valuestring);printf("Age: %d\n", age->valueint);}cJSON_Delete(json);}return 0;
}

注意 :上述示例代码中,函数cJSON_GetObjectItemCaseSensitive()和函数cJSON_IsString()不存在,请以 cJSON_GetObjectItem()和 type属性代替之。下同。

数组使用

#include <stdio.h>
#include <stdlib.h>
#include "cjson/cJSON.h"int main() {// 创建一个包含数组的 JSON 对象cJSON *json = cJSON_CreateObject();cJSON *array = cJSON_CreateIntArray(NULL, 0);// 向数组中添加元素int numbers[] = {1, 2, 3, 4, 5};cJSON_AddItemToArray(array, cJSON_CreateIntArray(numbers, sizeof(numbers)/sizeof(numbers[0])));// 将数组添加到 JSON 对象cJSON_AddItemToObject(json, "numbers", array);// 打印 JSON 对象char *jsonString = cJSON_Print(json);printf("%s\n", jsonString);// 获取并打印数组的大小int arraySize = cJSON_GetArraySize(cJSON_GetObjectItemCaseSensitive(json, "numbers"));printf("The size of the array is: %d\n", arraySize);// 清理 JSON 对象cJSON_Delete(json);free(jsonString);return 0;
}

工程实际测试实例:

文件:pwr_mngr_cfg.json

{"Device Path" : "/sys/class/device","Channel Index" : [1,2,3,4,5,6,7,8,9,10,27,28,29,30,31,32,43,44,45,52,53,54,55,56,57,58,63,64,65,66]
}

json配置文件的读写 :

全局变量:uint8_t PwrChnlIdxCfg[80];

代码:

    FILE *fp_JsonCfg = fopen("./pwr_mngr_cfg.json", "r");  /*  */if (fp_JsonCfg == NULL){perror("fopen(pwr_mngr_cfg.json) fail");exit(EXIT_FAILURE);}fseek(fp_JsonCfg, 0, SEEK_END);long json_obj_size = ftell(fp_JsonCfg);fseek(fp_JsonCfg, 0, SEEK_SET);char *pc_json_data = (char *)malloc(json_obj_size + 1);cJSON *json_root = NULL;char dev_name[128U];memset(dev_name, '\0', sizeof(dev_name));memset(PwrChnlIdxCfg, 0x00, sizeof(PwrChnlIdxRgt));if(pc_json_data !=  NULL){fread(pc_json_data, 1, json_obj_size, fp_JsonCfg);pc_json_data[json_obj_size] = '\0';json_root = cJSON_Parse(pc_json_data);if(json_root !=  NULL){const cJSON *dev_path = cJSON_GetObjectItem(json_root, "Device Path");if((dev_path->type == cJSON_String) && (dev_path->valuestring != NULL)){strcpy(dev_name, dev_path->valuestring);printf("Device Path: %s\n", dev_name);}const cJSON *chnl_idx = cJSON_GetObjectItem(json_root, "Channel Index");if (chnl_idx->type == cJSON_Array){int n_sz = cJSON_GetArraySize(chnl_idx);printf("Total Channel Index number is : %d\n", n_sz);for(int idx = 0; idx < n_sz; ++idx){const cJSON *cur_item  = cJSON_GetArrayItem(chnl_idx, idx);if(cur_item->type == cJSON_Number){PwrChnlIdxCfg[idx] = cur_item->valueint;printf("%d ", PwrChnlIdxCfg[idx]);}}printf("\n");}}cJSON_Delete(json_root);}fclose(fp_JsonCfg);free(pc_json_data);

测试结果:

(完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/413372.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

游泳耳机哪个牌子的好?四大口碑精品游泳耳机专业推荐!

在追求健康生活的同时&#xff0c;游泳成为了许多人选择的锻炼方式。它不仅能够帮助人们塑造身材&#xff0c;还能有效缓解压力。而在游泳过程中&#xff0c;音乐的陪伴无疑能让人更加享受这段时光。因此&#xff0c;一款适合游泳时使用的耳机&#xff0c;成为了游泳爱好者们不…

CSS学习笔记(01)flex布局

1、首先对父元素设置disiplay&#xff1a;felx&#xff0c; 其有6个属性 fex-direction:设置主轴的方向 justify-content:设置主轴上的子元素排列方式 flex-wrap:设置子元素是否换行 align-content:设置侧轴上的子元素的排列方式(多行) align-items:设置侧轴上的子元素排列方式…

前端性能优化:提升网站加载速度的五个关键技巧

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介前端性能优化&#xff1a;提升网站加载速度的五个关键技巧1. 引言2. 前端性能优化的五个关键技巧2.1 减少HTTP请求技巧说明实现示例 2.2 启用浏览器缓存技巧说明实现示例 2.3 使用内容分发网络&#xff08;CDN&#xff09;技巧说明…

8.27FLEX,BISON

RC ParseStage::handle_request(SQLStageEvent *sql_event) 这个意思是返回类型是RC&#xff0c;然后用到的函数来自 ParseStage&#xff0c;&#xff1a;&#xff1a;就是用来标识作用域的&#xff0c;函数名是handle_request&#xff0c;是ParseStage里的函数 FLEX BISON

一个浏览器插件如何月入12万美元:深入了解 GoFullPage

一个浏览器插件如何月入12万美元&#xff1a;深入了解 GoFullPage 前言 GoFullPage 这个插件的诞生&#xff0c;源于其创作者 Peter Coles 的一个简单想法&#xff1a;解决一个他在日常开发工作中遇到的痛点。早在 2012 年&#xff0c;Coles 发现许多现有的网页截图工具无法完…

x264 编码器 AArch64汇编系列:zigzag 扫描相关汇编函数

zigzag 在x264_zigzag_init函数中初始化具体的 zigzag 实现函数: 以scan_4x4为例 c 语言实现 4x4 变换块扫描:zigzag_scan_4x4_frame。#define ZIGZAG4_FRAME\ZIGDC( 0,

ssh远程连接服务

1、概述 一种安全访问远程服务器的协议&#xff0c;远程管理工具&#xff0c;通过加密方式管理连接&#xff0c;使服务器更安全。 2、加密算法 对称加密 发送密码前将密码数据加密成密文&#xff0c;然后发送出去 接收方收到密文后&#xff0c;使用同一个密钥将密文解密。…

windows安全中心永久卸载工具分享

使用方法 博客&#xff1a;h0ck1r丶羽~从零到一 卸载工具下载链接&#xff1a; 夸克网盘分享 一路回车&#xff0c;选项Y即可 耐心等待几秒种&#xff0c;自动重启 此时打开windows安全中心&#xff0c;已经完全不能使用了&#xff0c;响应的杀毒功能也关了 往期推荐 【渗透测…

【STM32】RTT-Studio中HAL库开发教程五:UART的DMA应用

文章目录 一、简介1.关于DMA2.DMA使用场景3.DMA控制结构4.IDLE空闲中断5.实现方法 二、RTT配置三、串口收发流程四、完整代码五、测试验证 一、简介 1.关于DMA DMA(Direct Memory Access&#xff0c;直接存储器访问) 是所有现代电脑的重要特色&#xff0c;它允许不同速度的硬件…

python办公自动化:PPT工具之`Python-PPTX`简介

第1章 简介 1.1 什么是Python-PPTX库&#xff1f; Python-PPTX库是一个用于创建和修改Microsoft PowerPoint (.pptx) 文件的Python库。它提供了一个易于使用的API&#xff0c;使得开发者能够以编程方式操纵PowerPoint文件&#xff0c;包括创建新文件、修改现有文件、添加文本…

2024最新最全面的JMeter 做接口加密测试

JMeter 怎么做接口的加密&#xff1f; JMeter如果需要做加密测试&#xff0c;是需要加密类型对应的jar包的。本文以MD5,加密作为教程。 1、在Test Plan 引用jar包&#xff1b; 2、添加BeanShell Sampler取样器&#xff0c;并输入调用代码 import md5.mymd5;//调用jar包 String…

Excel技巧(二)

函数 SUMIFS函数 用于计算其满足多个条件的全部参数的总量 语法&#xff1a;SUMIFS(sum_range, criteria_range1, criteria1, [criteria_range2, criteria2], ...) COUNTIFS函数 计算多个区域中满足给定条件的单元格的个数 语法&#xff1a;countifs(criteria_range1,crit…

翻译软件 Fastrans 开发日志 #2

就过了几天&#xff0c;我的 Fastrans 项目&#xff08; https://github.com/YaoqxCN/Fastrans &#xff09;又更新了两个版本&#xff0c;现在是 v1.1.1。&#xff08;求个 star 谢谢&#xff01;&#xff09; 上次我初步实现了 Fastrans 的翻译功能以及 UI&#xff0c;可以看…

平衡膳食与健康 第二篇

健康,不止于不生病. 不良的生活方式 瞎折腾 影响身体健康 实际上健康还包括在其他方面 精神方面 社会接触能力大夫问题复盘 慢性疾病&#xff0c;都是生活方式病 慢性病与生活方式密切相关 还有心理问题**:焦虑症,抑郁症** 健康医学和疾病医学差距 压健康状态比例 肚…

如何打造基于Java SpringBoot和Vue的医院门诊智能预约平台?四步实现高效就医流程,整合MySQL数据库,优化用户体验。

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

开发中如何在运行/调试时将项目热部署到Tomcat

这里有一篇不错的博客&#xff0c;可以参考 http://t.csdnimg.cn/oWcgm 正常情况下&#xff0c;我们将web项目打包成war包后&#xff0c;需要放到tomcat的webapps路径下&#xff0c;然后启动tomcat&#xff0c;才能正常访问。但是这在开发阶段是极为不便的。因此可以使用两种方…

电商库存API:商家数字化转型的加速器

在电商行业&#xff0c;库存管理是运营的核心之一。随着业务的扩展和消费者需求的多样化&#xff0c;传统的库存管理方法已经难以满足现代电商的需求。这时&#xff0c;电商库存API应运而生&#xff0c;为商家提供了一种高效、灵活的库存管理手段。 一、对接电商库存API的重要…

猫头虎分享:Python库 TensorFlow 的简介、安装、用法详解入门教程

猫头虎分享&#xff1a;Python库 TensorFlow 的简介、安装、用法详解入门教程 &#x1f42f; 摘要 今天猫头虎带大家走进 人工智能 的核心领域&#xff0c;深入探讨 TensorFlow 这个强大的 Python库。从 TensorFlow 的基础简介到详细的安装和用法&#xff0c;这篇教程将带你从…

cubeide Target is not responding, retrying... 或基于vscode方式等 无法调试

点击调试输出如图&#xff1a; 基于cubeidet开发环境&#xff0c;debug后输出&#xff1a; 基于vscode开发环境&#xff1a; OpenOCD: GDB Server Quit Unexpectedly. See gdb-server output in TERMINAL tab for more details. 解决方法&#xff1a; 这里的调试选择一个&…

AI大模型编写多线程并发框架(六十三):监听器优化·上

系列文章目录 文章目录 系列文章目录前言一、项目背景二、第七轮对话-补充异步执行代码三、第八轮对话-增加累计完成等字眼四、第九轮对话-线程安全优化五、第十轮对话-增加运行时数据七、参考文章 前言 在这个充满技术创新的时代&#xff0c;AI大模型正成为开发者们的新宠。它…