json 不同配置格式的优缺点?

rfbsl7qr  于 2023-07-01  发布在  其他
关注(0)|答案(6)|浏览(153)

我见过有人使用 .cfg(Python Buildout)、.xml(Gnome)、.json(Chrome扩展)、.yaml(Google App Engine)、*.ini甚至 *.py作为应用配置文件(比如Django)。
我的问题是:为什么有这么多不同的配置文件格式?我可以看到xml与json方法(少得多的冗长)或Python方法(有时你有一个Python应用程序,不想使用特定的模块来解析配置文件)的优势,但是其他方法呢?
我知道还有比我举例说明的那些配置文件更多的格式。它们之间的优势究竟是什么?历史原因?与不同系统的兼容性?
如果你要启动一个应用程序来读取某种配置文件(使用插件生态系统),你会使用哪一个?
我举的例子中哪些是最古老的?你知道这是历史吗?

pvcm50d1

pvcm50d11#

这主要是个人偏好、目的和可用的库。我个人认为xml对于配置文件来说太冗长了,但是它很流行,并且有很棒的库。
.cfg、.ini是工作良好的传统格式,许多语言都有一个包含的库来读取它们。我在Java、Python、C++中使用过它,没有任何问题。它实际上并不是一种数据交换格式,如果我传递数据,我可能会使用相同的格式进行配置和数据交换。
yaml和json介于xml和cfg/ini之间。您可以在这两种方式中定义许多数据结构,也可以像cfg一样定义简单的键值。这两种格式在python中都有很好的库,我假设许多其他语言也有库。我相信json是yaml的子集。
我从来没有使用过python文件作为配置,但它似乎在django上工作得很好。它确实允许你在配置中有一些可能有用的代码。
上一次选择格式时,我选择了yaml。它很简单,但有一些很好的功能,python库很容易安装,真的很好。Json紧随其后,因为yaml库解析了json,所以我选择了yaml。

oipij1gg

oipij1gg2#

请注意,这只是我的个人观点和推测,但我怀疑,格式过多的最大原因可能是缺乏一个现成的、无处不在的配置文件解析库。如果没有这些,大多数程序必须编写自己的解析器,因此通常会在配置结构需要有多复杂(分层与平面,纯数据与嵌入式逻辑,如if语句等),开发人员愿意花多少精力编写配置文件解析器以及最终用户应该有多少痛苦之间进行平衡。然而,你列出的每一个理由都可能是一两个项目选择格式的动机。
对于我自己的项目,我倾向于使用.ini,因为Python中已经内置了一个优秀的解析器,并且它对我的大多数用例来说都“足够好”。在这两种情况下,它是不够的,我已经使用了一个基于XML的配置文件,再次,由于相对简单的实现。

2jcobegt

2jcobegt3#

大多数配置文件格式继承了相当大的复杂性,因为它们支持太多的数据类型。例如,2可以被解释为整数、真实的和字符串,由于大多数配置语言都将值转换为这些底层数据类型,因此必须以这样的方式编写2这样的值,以传达值和类型。因此,2通常被解释为整数,2.0被解释为真实的,而"2"被解释为字符串。这使得不了解这些约定的非程序员很难使用这些语言。它还增加了语言的复杂性和混乱性。对于字符串尤其如此。字符串是任意字符的序列,因此有效的字符串可以包含引号字符。若要区分嵌入的引号字符和终止字符串的引号字符,必须对嵌入的引号字符进行转义。这导致了更多的复杂性和混乱。
JSON和Python是明确的,并且很好地处理了层次结构,但是被类型提示、引用和转义弄得一团糟。
YAML使引号成为可选的,这反过来又使格式变得不明确。
INI将所有值都作为字符串,这需要最终应用程序在需要时转换为预期的数据类型。这消除了对类型提示、引用和转义的需要。但是INI并不自然地支持层次结构,并且不是标准化的,并且不同的实现与它们对文件的解释不一致。
现在有一种新的格式,它类似于INI,所有的叶值都是字符串,但它是标准化的(它有一个明确的规范和一个全面的测试套件),并且自然地处理层次结构。NestedText产生了一种非常简单的配置格式,既适合程序员,也适合非程序员。它应该被视为所有新应用程序的配置文件和结构化数据文件格式,特别是对于那些文件将由临时用户读取、写入或修改的应用程序。

knpiaxh1

knpiaxh14#

这实际上取决于配置文件的读取器/写入器是否是(或者可以是)非程序员,或者是否具有严格的编程访问权限。
XML、JSON等完全不适合人类使用,而INI格式对人类来说还算合理。
如果配置文件仅具有编程访问权限(偶尔由程序员编辑),则任何受支持的格式(XML、JSON或INI)都是合适的。INI文件不适合结构化参数,XML和JSON可以支持数组、结构/对象等。

iq0todco

iq0todco5#

另一个可行的选择是toml,这是另一种“* 介于ini和xml* 之间”的格式。
今天,toml在Python中已经成熟-从Python 3.11 on tomllib包含在Python标准库中。它是一个只读解析器,但官方文档提到了外部读写库。
汤姆有什么好的?

# Toml prioritize human-readability, allowing comments.

[ section-1 ]
key = "value pair" # is basic.
"Thus looks" = "like ini."

list = ['And', 'arrays', 'are supported, too' ]
dict = { "json-like": "dict type is",
         "available": {
             "too.": "But this is",
             "very": "readable."
         }
       }

[ types ]
number.int = 123
numbers.hex = 0xABCD
numbers.float = 3.14e-16

local.date = 2023-06-28
local.time = 12:34:56

[ others ]
longline = '''Lorem
Ipsum Foo
Bar baz'''

comment = '''This could've been specified as others.comment.
See the official document for the details.'''
q1qsirdb

q1qsirdb6#

根据Python官方文档,“未来对配置功能的增强将添加到dictConfig()”。
因此,任何可以与dictconfig()一起使用的配置文件都应该是好的。

相关问题