当前位置: 首页 > news >正文

项目配置文件选择(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)

选择使用哪种类型的配置文件&#xff08;如 JSON、XML 或其他格式&#xff09;取决于多个因素&#xff0c;包括项目的需求、团队的熟悉程度、数据结构的复杂性以及可读性和可维护性等。以下是对常见配置文件格式的比较&#xff0c;以及在不同情况下的推荐&#xff1a; 1. JSON&…...

Android 使用Retrofit 以纯二进制文件流上传文件

一、背景 一般上传文件都是以表单形式上传文件&#xff0c;最近项目中涉及到非表单形式上传文件流&#xff0c;分为单个文件流上传、大文件分段上传&#xff0c;此种情景资料较少&#xff0c;这里记录下。 二、方案介绍 2.1 需求协议 1. 上传文件 API 端点&#xff1a;/serv…...

Vue3踩坑记录

目录 一、定义常变量 1.1、ref和reactive到底用谁&#xff1f; 二、双向绑定 2.1、直接改变表格该行数据 2.1、在弹窗改变表格该行数据 一、定义常变量 1.1、ref和reactive到底用谁&#xff1f; 已知&#xff1a;使用ref定义基础类型数据&#xff1b;使用reactive定义复…...

大数据-227 离线数仓 - Flume 自定义拦截器(续接上节) 采集启动日志和事件日志

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…...

【热门主题】000054 ECMAScript:现代 Web 开发的核心语言

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热…...

【Pytorch】torch.nn.functional模块中的非线性激活函数

在使用torch.nn.functional模块时&#xff0c;需要导入包&#xff1a; from torch.nn import functional 以下是常见激活函数的介绍以及对应的代码示例&#xff1a; tanh (双曲正切) 输出范围&#xff1a;(-1, 1) 特点&#xff1a;中心对称&#xff0c;适合处理归一化后的数据…...

reactflow 中 useNodesState 模块作用

1. 节点状态管理核心功能 useNodesState是一个关键的钩子函数&#xff0c;用于专门管理节点&#xff08;Nodes&#xff09;的状态。节点是流程图的核心元素&#xff0c;它们可以代表各种实体&#xff0c;如流程中的任务、系统中的组件或者数据结构中的元素。 useNodesState提…...

Go语言内存分配源码分析学习笔记

大家好&#xff0c;我是V 哥。GO GO GO&#xff0c;今天来说一说Go语言内存分配问题&#xff0c;Go语言内存分配的源码主要集中在runtime包中&#xff0c;它实现了Go语言的内存管理&#xff0c;包括初始化、分配、回收和释放等。下面来对这些过程详细分析一下&#xff0c;先赞后…...

【jvm】方法区常用参数有哪些

目录 1. -XX:PermSize2. -XX:MaxPermSize3. -XX:MetaspaceSize&#xff08;Java 8及以后&#xff09;4. -XX:MaxMetaspaceSize&#xff08;Java 8及以后&#xff09;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&#xff0c;下载后&#xff0c;直接双击运行&#xff0c;我这里默认安装到…...

LLM文档对话 —— pdf解析关键问题

一、为什么需要进行pdf解析&#xff1f; 最近在探索ChatPDF和ChatDoc等方案的思路&#xff0c;也就是用LLM实现文档助手。在此记录一些难题和解决方案&#xff0c;首先讲解主要思想&#xff0c;其次以问题回答的形式展开。 二、为什么需要对pdf进行解析&#xff1f; 当利用L…...

MySQL单表查询时索引使用情况

本文针对 MySQL 单表查询时索引使用的几种场景情况进行分析。 假设有一个表如下&#xff1a; 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" 指出了一个问题&#xff0c;即在非主线程中尝试启用或禁用套接字通知器&#xff08;QSocketNotifier&#xff09;…...

入门到精通mysql数据(四)

5、运维篇 5.1、日志 5.1.1、错误日志 错误日志是MySQL中最重要的日志之一,它记录了当mysqld启动和停止,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。 该日志是默认开启的,默认存放目录/var/log…...

Java 设计模式 详解

在Java开发中&#xff0c;设计模式是一种常见的、成熟的解决方案&#xff0c;用于应对特定的设计问题和复杂性管理。以下是一些常用的设计模式&#xff0c;它们可以分为三类&#xff1a;创建型模式、结构型模式和行为型模式。 一、创建型模式 创建型模式主要负责对象的创建&a…...

卡尔曼滤波学习资料汇总

卡尔曼滤波学习资料汇总 其实&#xff0c;当初的目的&#xff0c;是为了写 MPU6050 的代码的&#xff0c;然后不知不觉学了那么多&#xff0c;也是因为好奇、感兴趣吧 有些还没看完&#xff0c;之后笔记也会同步更新的 学习原始材料 【卡尔曼滤波器】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机器人。 具体配置步骤&#xff1a;打开西门子博图配置软件&#xff0c;添加PLC。这是配置的第一步&am…...

自动化运维-检测Linux服务器CPU、内存、负载、IO读写、机房带宽和服务器类型等信息脚本

前言&#xff1a;以上脚本为今年8月1号发布的&#xff0c;当时是没有任何问题&#xff0c;但现在脚本里网络速度测试py文件获取不了了&#xff0c;测速这块功能目前无法实现&#xff0c;后面我会抽时间来研究&#xff0c;大家如果有建议也可以分享下。 脚本内容&#xff1a; #…...

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的用户时&#xff0c;才会执行&#xff0c;如果…...

从视频帧生成点云数据、使用PointNet++模型提取特征,并将特征保存下来的完整实现。

文件地址 https://github.com/yanx27/Pointnet_Pointnet2_pytorch?spm5176.28103460.0.0.21a95d27ollfze Pointnet_Pointnet2_pytorch\log\classification\pointnet2_ssg_wo_normals文件夹改名为Pointnet_Pointnet2_pytorch\log\classification\pointnet2_cls_ssg "E:…...

工化企业内部能源能耗过大 落实能源管理

一、精准监测与数据分析 实时准确的数据采集 企业能耗管理系统能够对企业内各种能源&#xff08;如电、水、气、热等&#xff09;的使用情况进行实时监测。通过安装在能源供应线路和设备上的智能传感器&#xff0c;可以精确地采集能源消耗的各项数据&#xff0c;包括瞬时流量、…...

LSTM 和 LSTMCell

1. LSTM 和 LSTMCell 的简介 LSTM (Long Short-Term Memory): 一种特殊的 RNN&#xff08;循环神经网络&#xff09;&#xff0c;用于解决普通 RNN 中 梯度消失 或 梯度爆炸 的问题。能够捕获 长期依赖关系&#xff0c;适合处理序列数据&#xff08;如自然语言、时间序列等&…...

python成长技能之正则表达式

文章目录 一、认识正则表达式二、使用正则表达式匹配单一字符三、正则表达式之重复出现数量匹配四、使用正则表达式匹配字符集五、正则表达式之边界匹配六、正则表达式之组七、正则表达式之贪婪与非贪婪 一、认识正则表达式 什么是正则表达式 正则表达式&#xff08;英语&…...

解决docker报Error response from daemon Get httpsregistry-1.docker.iov2错误

解决docker报Error response from daemon: Get "https://registry-1.docker.io/v2/"错误 报错详情 首先先看一下问题报错效果,我想要拉去nacos-serve&#xff1a;1.1.4的镜像&#xff0c;报如下错误&#xff0c;从报错信息可以看到&#xff0c;用于网络的愿意&…...

【论文分享】利用多源大数据衡量街道步行环境的老年友好性:以中国上海为例

本次给大家带来一篇SCI论文的全文翻译&#xff01;该论文考虑了绿化程度、可步行性、安全性、形象性、封闭性和复杂性这六个指标&#xff0c;提出了一种基于多源地理空间大数据的新型定量评价模型&#xff0c;用于从老年人和专家的角度评估街道步行环境的老年友好程度&#xff…...

说说软件工程中的“协程”

在软件工程中&#xff0c;协程&#xff08;coroutine&#xff09;是一种程序运行的方式&#xff0c;可以理解成“协作的线程”或“协作的函数”。以下是对协程的详细解释&#xff1a; 一、协程的基本概念 定义&#xff1a;协程是一组序列化的子过程&#xff0c;用户能像指挥家…...

使用IDE实现java端远程调试功能

使用IDE实现java端远程调试功能 1. 整体描述2. 前期准备3. 具体操作3.1 修改启动命令3.2 IDE配置3.3 打断点3.4 运行Debug 4. 总结 1. 整体描述 在做项目时&#xff0c;有些时候&#xff0c;需要和第三方进行调式&#xff0c;但是第三方不在一起&#xff0c;需要进行远程调试&…...

javaScript交互案例2

1、京东侧边导航条 需求&#xff1a; 原先侧边栏是绝对定位当页面滚动到一定位置&#xff0c;侧边栏改为固定定位页面继续滚动&#xff0c;会让返回顶部显示出来 思路&#xff1a; 需要用到页面滚动事件scroll&#xff0c;因为是页面滚动&#xff0c;所以事件源是document滚动…...

JavaScript 浏览器对象模型 BOM

浏览器对象模型&#xff08;Browser Object Model&#xff0c;BOM&#xff09;是指一组与浏览器进行交互的 JavaScript 对象。它允许 JavaScript 与浏览器的组件进行交互&#xff0c;比如窗口、文档、历史记录等。BOM 不同于 DOM&#xff08;文档对象模型&#xff09;&#xff…...

安徽省招标投标信息网/百度推广优化方案

你知道吗&#xff0c;一辆自动驾驶汽车每天生成的数据量达到4TB&#xff0c;而一个人每天最多生成1.5GB的数据。这一数据量级上的差距说明什么&#xff1f;今天的世界&#xff0c;人工智能、5G连接、物联网等正成为驱动业务发展和创新的原动力。 英特尔预测&#xff0c;数据中心…...

wordpress极简淘客主题/湖北seo关键词排名优化软件

Description vani和cl2在一片树林里捉迷藏…… 这片树林里有N座房子&#xff0c;M条有向道路&#xff0c;组成了一张有向无环图。 树林里的树非常茂密&#xff0c;足以遮挡视线&#xff0c;但是沿着道路望去&#xff0c;却是视野开阔。如果从房子A沿着路走下去能够到达B&#…...

网站建设技术公司/营销计划书7个步骤

-二叉树递归遍历与非递归遍历实现 引言0 有关线性表结点定义-LinkNode1 栈的链式存储结构实现-LinkedStack2 队列的链式存储结构实现-LinkedQueue3 二叉树的链式存储结构实现3.1 树的结点定义-TreeNode3.2 二叉树定义3.3 前中后序遍历-递归算法实现3.4 前中后序遍历-非递归算法…...

网站空间到期怎么办/网络优化工程师工资

July ● 2019纳思达Hello 大家好&#xff0c;感谢大家长久以来对纳思达集团的信任与支持。七月第三周要闻为您呈现以下精彩内容&#xff1a;手机NFC功能完美匹配奔图M7100DW打印机手机文件传到电脑再打印很麻烦&#xff1f;不如试试奔图M7100DW打印机&#xff0c;手机NFC功能轻…...

萍乡企业网站制作/seo收录查询工具

performance.memory jsHeapSizeLimit js内存使用大小限制 totalJSHeapSize js总内存 usedJSHeapSize js已使用内存 复制代码 注&#xff1a; usedJSHeapSize表示所有被使用的js堆栈内存&#xff1b; totalJSHeapSize表示当前js堆栈内存总大小&#xff0c;这表示usedJSHeapSize…...

建站之星模板好吗/纵横seo

1.occupancy grid作用是什么...