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

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

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

相关文章

21.3D surface

3D surface """ File : 05-decoding-Major Name : 3d_surface.py Author : lyq Date : 2024/11/16 23:10 Envi : PyCharm Description: files details """ import numpy as np import matplotlib.pyplot as plt# 设置全局默认字体…

ARM(安谋) China处理器

0 Preface/Foreword 0.1 参考博客 Cortex-M23/M33与STAR-MC1星辰处理器 ARM China&#xff0c;2018年4月established&#xff0c;独立运行。 1 处理器类型 1.1 周易AIPU 1.2 STAR-MC1&#xff08;星辰处理器&#xff09; STAT-MC1&#xff0c;主要为满足AIOT应用性能、功…

windows C#-异步编程概述(二)

不要阻塞&#xff0c;而要等待 上述代码演示了一种不好的做法&#xff1a;构建同步代码来执行异步操作。正如所写&#xff0c;此代码会阻止执行它的线程执行任何其他工作。在任何任务正在进行时&#xff0c;它都不会被中断。这就像你把面包放进去后盯着烤面包机一样。你会忽略…

【Android原生问题分析】夸克、抖音划动无响应问题【Android14】

1 问题描述 偶现问题&#xff0c;用户打开夸克、抖音后&#xff0c;在界面上划动无响应&#xff0c;但是没有ANR。回到Launcher后再次打开夸克/抖音&#xff0c;发现App的界面发生了变化&#xff0c;但是仍然是划不动的。 2 log初分析 复现问题附近的log为&#xff1a; 用户…

【STM32】MPU6050简介

文章目录 MPU6050简介MPU6050关键块带有16位ADC和信号调理的三轴MEMS陀螺仪具有16位ADC和信号调理的三轴MEMS加速度计I2C串行通信接口 MPU6050对应的数据手册&#xff1a;MPU6050 陀螺仪加速度计 链接: https://pan.baidu.com/s/13nwEhGvsfxx0euR2hMHsyw?pwdv2i6 提取码: v2i6…

【软件测试】设计测试用例的万能公式

文章目录 概念设计测试用例的万能公式常规思考逆向思维发散性思维万能公式水杯测试弱网测试如何进行弱网测试 安装卸载测试 概念 什么是测试用例&#xff1f; 测试⽤例&#xff08;Test Case&#xff09;是为了实施测试⽽向被测试的系统提供的⼀组集合&#xff0c;这组集合包…

使用 TensorFlow 实现 ZFNet 进行 MNIST 图像分类

ZFNet&#xff08;ZF-Net&#xff09;是由 Matthew Zeiler 和 Rob Fergus 提出的卷积神经网络架构&#xff0c;它在图像分类任务中取得了显著的效果。它在标准卷积神经网络&#xff08;CNN&#xff09;的基础上做了一些创新&#xff0c;例如优化了卷积核大小和池化策略&#xf…

如何让手机ip变成动态

在数字化浪潮中&#xff0c;手机已成为我们日常生活中不可或缺的一部分。无论是浏览网页、使用社交媒体还是进行在线购物&#xff0c;手机都扮演着举足轻重的角色。然而&#xff0c;在享受网络带来的便利时&#xff0c;我们也需要关注网络安全和隐私保护。静态IP地址可能让手机…

前端三大组件之CSS,三大选择器,游戏网页仿写

回顾 full stack全栈 Web前端三大组件 结构(html) 样式(css) 动作/交互(js) --- 》 框架vue&#xff0c;安哥拉 div 常用的标签 扩展标签 列表 ul/ol order——有序号 unordered——没序号的黑点 <!DOCTYPE html> <html><head><meta charset"…

CPU执行指令的过程

通过前面两篇文章的介绍&#xff0c;我们已经认识到了&#xff1a;可执行程序通过作业调度装入内存&#xff0c;操作系统为进程创建虚拟地址空间&#xff0c;分配物理内存&#xff0c;建立页表&#xff08;映射关系&#xff09;&#xff0c;申请并初始化PCB&#xff0c;开始调度…

【MySQL】InnoDB内存结构

目录 InnoDB内存结构 主要组成 缓冲池 缓冲池的作用 缓冲池的结构 缓冲池中页与页之间连接方式分析 缓冲池如何组织数据 控制块初始化 页面初始化 缓冲池中页的管理 缓冲区淘汰策略 查看缓冲池信息 总结 变更缓冲区-Chang Buffer 变更缓冲区的作用 主要配置选项…

论文笔记 SuDORMRF:EFFICIENT NETWORKS FOR UNIVERSAL AUDIO SOURCE SEPARATION

SUDORMRF: EFFICIENT NETWORKS FOR UNIVERSAL AUDIO SOURCE SEPARATION 人的精神寄托可以是音乐&#xff0c;可以是书籍&#xff0c;可以是运动&#xff0c;可以是工作&#xff0c;可以是山川湖海&#xff0c;唯独不可以是人。 Depthwise Separable Convolution 深度分离卷积&a…

SpringBoot+React养老院管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.入住合同文件上传2.添加和修改套餐的代码3.查看入住记录代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBootReact框架开发的养老院管理系统。首先…

w039基于Web足球青训俱乐部管理后台系统开发

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

Go 语言已立足主流,编程语言排行榜24 年 11 月

Go语言概述 Go语言&#xff0c;简称Golang&#xff0c;是由Google的Robert Griesemer、Rob Pike和Ken Thompson在2007年设计&#xff0c;并于2009年11月正式宣布推出的静态类型、编译型开源编程语言。Go语言以其提高编程效率、软件构建速度和运行时性能的设计目标&#xff0c;…

【java】链表:判断链表是否成环

问题&#xff1a; 分析&#xff1a; 这里我们还是定义快慢双指针 。 如果有环&#xff0c;快慢指针一定会相遇。 // 构建成环链表public void makeCircle(){Node node1new Node(1);Node node2new Node(2);Node node3new Node(5);Node node4new Node(6);Node node5new …

基于视觉智能的时间序列基础模型

GitHub链接&#xff1a;ViTime: A Visual Intelligence-Based Foundation Model for Time Series Forecasting 论文链接&#xff1a;https://github.com/IkeYang/ViTime 前言 作者是来自西安理工大学&#xff0c;西北工业大学&#xff0c;以色列理工大学以及香港城市大学的研…

006.精读《Apache Paimon Docs - Concepts》

文章目录 1. 引言2. 基本概念2.1 基本构成2.2 Schema2.3 Snapshot2.4 Manifest2.5 Data File2.6 Table2.7 File index 3.并发控制3.1 基本概念3.2 快照冲突3.3 文件冲突 4. 总结 1. 引言 在本期的技术深度解析中&#xff0c;我们将学习并且了解Apache Paimon 的基本概念&#…

RedHat7—Linux中kickstart自动安装脚本制作

本实验使用虚拟机版本为rhel7&#xff0c;从rhel7后的版本kickstart工具进行收费使用。 1.在VMware关闭dhcp自动获取ip地址功能 2.安装并启动httpd [rootlocalhost ~]# yum install httpd [rootlocalhost ~]# systemctl start httpd [rootlocalhost ~]#systemctl stop firewal…

数据集的重要性:如何构建AIGC训练集

文章目录 一、为什么数据集对AIGC如此重要&#xff1f;1. 数据决定模型的知识边界2. 数据质量直接影响生成效果3. 数据集多样性提升模型鲁棒性 二、构建AIGC训练集的关键步骤1. 明确目标任务和生成需求2. 数据源的选择3. 数据清洗与预处理4. 数据标注5. 数据增强 三、针对不同类…