项目配置文件选择(Json,xml,Yaml, INI)
选择使用哪种类型的配置文件(如 JSON、XML 或其他格式)取决于多个因素,包括项目的需求、团队的熟悉程度、数据结构的复杂性以及可读性和可维护性等。以下是对常见配置文件格式的比较,以及在不同情况下的推荐:
1. JSON(JavaScript Object Notation)
优点:
- 简洁易读:JSON 语法简单,易于理解和编写。
- 广泛支持:几乎所有编程语言都有库支持 JSON,易于集成。
- 轻量级:相较于 XML,JSON 文件通常更小,解析速度更快。
- 适合数据结构:非常适合表示简单的键值对和数组结构。
缺点:
- 不支持注释:JSON 不允许注释,这可能会使得配置文件的解释变得困难。
- 类型限制:JSON 只支持字符串、数字、布尔值、数组和对象,无法表示更复杂的数据类型。
适用场景:
- 当配置数据结构简单,且需要易于阅读和维护时,JSON 是一个很好的选择。
2. XML(eXtensible Markup Language)
优点:
- 结构化:XML 允许定义复杂的层次结构,适合表示复杂的数据关系。
- 支持注释:可以在 XML 文件中添加注释,便于解释配置内容。
- 自描述性:XML 标签可以自定义,提供更好的上下文信息。
缺点:
- 冗长:XML 文件通常比 JSON 更冗长,导致文件大小增加。
- 解析复杂性:相较于 JSON,XML 的解析可能更复杂,尤其是在处理命名空间时。
适用场景:
- 当需要表示复杂的层次结构或需要支持注释时,XML 是一个合适的选择。
3. YAML(YAML Ain't Markup Language)
优点:
- 人类可读性强:YAML 语法非常简洁,易于阅读和编写。
- 支持复杂数据结构:可以表示复杂的层次结构和数据类型。
- 支持注释:可以在 YAML 文件中添加注释。
缺点:
- 解析库支持:虽然大多数语言都有 YAML 解析库,但相较于 JSON 和 XML,支持可能不如前两者广泛。
- 缩进敏感:YAML 对缩进非常敏感,容易导致格式错误。
适用场景:
- 当需要一个易于阅读和维护的配置文件,且数据结构较复杂时,YAML 是一个很好的选择。
4. INI 文件
优点:
- 简单易用:INI 文件格式简单,易于理解和编辑。
- 广泛支持:许多编程语言都有库支持 INI 文件。
缺点:
- 功能有限:INI 文件不支持复杂的数据结构,通常只适合简单的键值对。
- 不支持嵌套:不支持层次结构,所有配置都在同一层级。
适用场景:
- 当配置数据非常简单,且不需要复杂的结构时,INI 文件是一个合适的选择。
总结与推荐
- 简单配置:如果你的配置数据简单且不需要复杂的结构,使用 JSON 或 INI 文件是一个不错的选择。
- 复杂结构:如果需要表示复杂的层次结构,使用 XML 或 YAML 更为合适。
- 可读性:如果可读性是首要考虑,YAML 是一个很好的选择,因为它的语法非常简洁。
- 团队熟悉度:考虑团队对不同格式的熟悉程度,选择大家都能轻松使用和维护的格式。
以下是例子:
1. JSON 示例JSON 文件 (`config.json`)json
{"hatchCycles": [5, 10, 15, 20],"maxRetries": 3,"enableFeatureX": true
}C++ 代码使用 `nlohmann/json` 库来读取 JSON 文件:cpp
include <iostream>
include <fstream>
include <unordered_set>
include <nlohmann/json.hpp>using json = nlohmann::json;
using namespace std;class Config {
public:void load(const string& filename);void printConfig();private:unordered_set<int> hatchCycles;int maxRetries;bool enableFeatureX;
};void Config::load(const string& filename) {ifstream configFile(filename);if (!configFile.is_open()) {cerr << "Could not open " << filename << endl;return;}json config;configFile >> config;// Load valuesfor (const auto& cycle : config["hatchCycles"]) {hatchCycles.insert(cycle.get<int>());}maxRetries = config["maxRetries"];enableFeatureX = config["enableFeatureX"];
}void Config::printConfig() {cout << "Hatch Cycles: ";for (const auto& cycle : hatchCycles) {cout << cycle << " ";}cout << "\nMax Retries: " << maxRetries;cout << "\nEnable Feature X: " << (enableFeatureX ? "true" : "false") << endl;
}int main() {Config config;config.load("config.json");config.printConfig();return 0;
}2. XML 示例XML 文件 (`config.xml`)xml
<?xml version="1.0" encoding="UTF-8"?>
<config><hatchCycles><cycle>5</cycle><cycle>10</cycle><cycle>15</cycle><cycle>20</cycle></hatchCycles><maxRetries>3</maxRetries><enableFeatureX>true</enableFeatureX>
</config>C++ 代码使用 `tinyxml2` 库来读取 XML 文件:cpp
include <iostream>
include <unordered_set>
include <tinyxml2.h>using namespace std;
using namespace tinyxml2;class Config {
public:void load(const string& filename);void printConfig();private:unordered_set<int> hatchCycles;int maxRetries;bool enableFeatureX;
};void Config::load(const string& filename) {XMLDocument doc;if (doc.LoadFile(filename.c_str()) != XML_SUCCESS) {cerr << "Could not open " << filename << endl;return;}// Load hatch cyclesXMLElement* hatchCyclesElement = doc.FirstChildElement("config")->FirstChildElement("hatchCycles");for (XMLElement* cycle = hatchCyclesElement->FirstChildElement("cycle"); cycle != nullptr; cycle = cycle->NextSiblingElement("cycle")) {hatchCycles.insert(cycle->IntText());}// Load other valuesmaxRetries = doc.FirstChildElement("config")->FirstChildElement("maxRetries")->IntText();enableFeatureX = doc.FirstChildElement("config")->FirstChildElement("enableFeatureX")->BoolText();
}void Config::printConfig() {cout << "Hatch Cycles: ";for (const auto& cycle : hatchCycles) {cout << cycle << " ";}cout << "\nMax Retries: " << maxRetries;cout << "\nEnable Feature X: " << (enableFeatureX ? "true" : "false") << endl;
}int main() {Config config;config.load("config.xml");config.printConfig();return 0;
}3. YAML 示例YAML 文件 (`config.yaml`)yaml
hatchCycles:- 5- 10- 15- 20
maxRetries: 3
enableFeatureX: trueC++ 代码使用 `yaml-cpp` 库来读取 YAML 文件:cpp
include <iostream>
include <unordered_set>
include <yaml-cpp/yaml.h>using namespace std;class Config {
public:void load(const string& filename);void printConfig();private:unordered_set<int> hatchCycles;int maxRetries;bool enableFeatureX;
};void Config::load(const string& filename) {YAML::Node config = YAML::LoadFile(filename);// Load hatch cyclesfor (const auto& cycle : config["hatchCycles"]) {hatchCycles.insert(cycle.as<int>());}// Load other valuesmaxRetries = config["maxRetries"].as<int>();enableFeatureX = config["enableFeatureX"].as<bool>();
}void Config::printConfig() {cout << "Hatch Cycles: ";for (const auto& cycle : hatchCycles) {cout << cycle << " ";}cout << "\nMax Retries: " << maxRetries;cout << "\nEnable Feature X: " << (enableFeatureX ? "true" : "false") << endl;
}int main() {Config config;config.load("config.yaml");config.printConfig();return 0;
}4. INI 示例INI 文件 (`config.ini`)ini
[Settings]
hatchCycles = 5, 10, 15, 20
maxRetries = 3
enableFeatureX = trueC++ 代码使用 `inih` 库来读取 INI 文件:cpp
include <iostream>
include <unordered_set>
include <inih/INIReader.h>using namespace std;class Config {
public:void load(const string& filename);void printConfig();private:unordered_set<int> hatchCycles;int maxRetries;bool enableFeatureX;
};void Config::load(const string& filename) {INIReader reader(filename);if (reader.ParseError() < 0) {cerr << "Could not open " << filename << endl;return;}// Load hatch cyclesstring cycles = reader.Get("Settings", "hatchCycles", "");size_t pos = 0;while ((pos = cycles.find(',')) != string::npos) {hatchCycles.insert(stoi(cycles.substr(0, pos)));cycles.erase(0, pos + 1);}hatchCycles.insert(stoi(cycles)); // Insert the last cycle// Load other valuesmaxRetries = reader.GetInteger("Settings", "maxRetries", 0);enableFeatureX = reader.GetBoolean("Settings", "enableFeatureX", false);
}void Config::printConfig() {cout << "Hatch Cycles: ";for (const auto& cycle : hatchCycles) {cout << cycle << " ";}cout << "\nMax Retries: " << maxRetries;cout << "\nEnable Feature X: " << (enableFeatureX ? "true" : "false") << endl;
}int main() {Config config;config.load("config.ini");config.printConfig();return 0;
}
相关文章:
项目配置文件选择(Json,xml,Yaml, INI)
选择使用哪种类型的配置文件(如 JSON、XML 或其他格式)取决于多个因素,包括项目的需求、团队的熟悉程度、数据结构的复杂性以及可读性和可维护性等。以下是对常见配置文件格式的比较,以及在不同情况下的推荐: 1. JSON&…...
Android 使用Retrofit 以纯二进制文件流上传文件
一、背景 一般上传文件都是以表单形式上传文件,最近项目中涉及到非表单形式上传文件流,分为单个文件流上传、大文件分段上传,此种情景资料较少,这里记录下。 二、方案介绍 2.1 需求协议 1. 上传文件 API 端点:/serv…...
Vue3踩坑记录
目录 一、定义常变量 1.1、ref和reactive到底用谁? 二、双向绑定 2.1、直接改变表格该行数据 2.1、在弹窗改变表格该行数据 一、定义常变量 1.1、ref和reactive到底用谁? 已知:使用ref定义基础类型数据;使用reactive定义复…...
大数据-227 离线数仓 - Flume 自定义拦截器(续接上节) 采集启动日志和事件日志
点一下关注吧!!!非常感谢!!持续更新!!! Java篇开始了! 目前开始更新 MyBatis,一起深入浅出! 目前已经更新到了: Hadoop࿰…...
【热门主题】000054 ECMAScript:现代 Web 开发的核心语言
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【热…...
【Pytorch】torch.nn.functional模块中的非线性激活函数
在使用torch.nn.functional模块时,需要导入包: from torch.nn import functional 以下是常见激活函数的介绍以及对应的代码示例: tanh (双曲正切) 输出范围:(-1, 1) 特点:中心对称,适合处理归一化后的数据…...
reactflow 中 useNodesState 模块作用
1. 节点状态管理核心功能 useNodesState是一个关键的钩子函数,用于专门管理节点(Nodes)的状态。节点是流程图的核心元素,它们可以代表各种实体,如流程中的任务、系统中的组件或者数据结构中的元素。 useNodesState提…...
Go语言内存分配源码分析学习笔记
大家好,我是V 哥。GO GO GO,今天来说一说Go语言内存分配问题,Go语言内存分配的源码主要集中在runtime包中,它实现了Go语言的内存管理,包括初始化、分配、回收和释放等。下面来对这些过程详细分析一下,先赞后…...
【jvm】方法区常用参数有哪些
目录 1. -XX:PermSize2. -XX:MaxPermSize3. -XX:MetaspaceSize(Java 8及以后)4. -XX:MaxMetaspaceSize(Java 8及以后)5. -Xnoclassgc6. -XX:TraceClassLoading7.-XX:TraceClassUnLoading 1. -XX:PermSize 1.设置JVM初始分配的永久…...
JAVA环境的配置
首先找到JDK环境的官网。 Java Archive Downloads - Java SE 8u211 and laterhttps://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html 我下载的最后一个x64.exe,下载后,直接双击运行,我这里默认安装到…...
LLM文档对话 —— pdf解析关键问题
一、为什么需要进行pdf解析? 最近在探索ChatPDF和ChatDoc等方案的思路,也就是用LLM实现文档助手。在此记录一些难题和解决方案,首先讲解主要思想,其次以问题回答的形式展开。 二、为什么需要对pdf进行解析? 当利用L…...
MySQL单表查询时索引使用情况
本文针对 MySQL 单表查询时索引使用的几种场景情况进行分析。 假设有一个表如下: CREATE TABLE single_table (id INT NOT NULL AUTO_INCREMENT,key1 VARCHAR(100),key2 INT,key3 VARCHAR(100),key_part1 VARCHAR(100),key_part2 VARCHAR(100),key_part3 VARCHAR(1…...
Qt邮箱程序改良版(信号和槽)
上一版代码可以正常使用,但是会报错 上一篇文章 错误信息 "QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread" 指出了一个问题,即在非主线程中尝试启用或禁用套接字通知器(QSocketNotifier)…...
入门到精通mysql数据(四)
5、运维篇 5.1、日志 5.1.1、错误日志 错误日志是MySQL中最重要的日志之一,它记录了当mysqld启动和停止,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。 该日志是默认开启的,默认存放目录/var/log…...
Java 设计模式 详解
在Java开发中,设计模式是一种常见的、成熟的解决方案,用于应对特定的设计问题和复杂性管理。以下是一些常用的设计模式,它们可以分为三类:创建型模式、结构型模式和行为型模式。 一、创建型模式 创建型模式主要负责对象的创建&a…...
卡尔曼滤波学习资料汇总
卡尔曼滤波学习资料汇总 其实,当初的目的,是为了写 MPU6050 的代码的,然后不知不觉学了那么多,也是因为好奇、感兴趣吧 有些还没看完,之后笔记也会同步更新的 学习原始材料 【卡尔曼滤波器】1_递归算法_Recursive P…...
linux003.在ubuntu中安装cmake的方法
1.cmake安装程序下载 https://cmake.org/files/v3.30/ 2.解压并下载包 解压cmake压缩包 tar -xvzf cmake.tar.gz进入解压目录 cd cmake-<version>编辑~/.bashrc nano ~/.bashrc在文件的末尾添加如下代码 export PATH/home/xwl/software/cmake/bin:$PATH然后运行以…...
EtherNet/IP转Profinet网关连接发那科机器人配置实例解析
本案例主要展示了如何通过Ethernet/IP转Profinet网关实现西门子1200PLC与发那科搬运机器人的连接。所需的设备有西门子1200PLC、开疆智能Ethernet/IP转Profinet网关以及Fanuc机器人。 具体配置步骤:打开西门子博图配置软件,添加PLC。这是配置的第一步&am…...
自动化运维-检测Linux服务器CPU、内存、负载、IO读写、机房带宽和服务器类型等信息脚本
前言:以上脚本为今年8月1号发布的,当时是没有任何问题,但现在脚本里网络速度测试py文件获取不了了,测速这块功能目前无法实现,后面我会抽时间来研究,大家如果有建议也可以分享下。 脚本内容: #…...
ubuntu24.04设置开机自启动Eureka
ubuntu24.04设置开机自启动Eureka 之前我们是在/root/.bashrc的文件中增加了一条命令 nohup java -jar /usr/software/eurekaServer-auth-prd-03.jar > /usr/software/log.log 2>&1 &但上面这条命令只有在登录root的用户时,才会执行,如果…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
