YAML和JSON之间有什么不同,特别是考虑到以下事情?
性能(编码/解码时间) 内存消耗 表达清晰 库可用性,易用性(我更喜欢C)
我打算在我们的嵌入式系统中使用这两个中的一个来存储配置文件。
相关:
应该使用YAML还是JSON来存储Perl数据?
YAML和JSON之间有什么不同,特别是考虑到以下事情?
性能(编码/解码时间) 内存消耗 表达清晰 库可用性,易用性(我更喜欢C)
我打算在我们的嵌入式系统中使用这两个中的一个来存储配置文件。
相关:
应该使用YAML还是JSON来存储Perl数据?
当前回答
绕过深奥的理论
这回答了标题,而不是细节,因为大多数人只是从谷歌上的搜索结果中阅读标题,就像我一样,所以我觉得有必要从web开发人员的角度解释。
YAML uses space indentation, which is familiar territory for Python developers. JavaScript developers love JSON because it is a subset of JavaScript and can be directly interpreted and written inside JavaScript, along with using a shorthand way to declare JSON, requiring no double quotes in keys when using typical variable names without spaces. There are a plethora of parsers that work very well in all languages for both YAML and JSON. YAML's space format can be much easier to look at in many cases because the formatting requires a more human-readable approach. YAML's form while being more compact and easier to look at can be deceptively difficult to hand edit if you don't have space formatting visible in your editor. Tabs are not spaces so that further confuses if you don't have an editor to interpret your keystrokes into spaces. JSON is much faster to serialize and deserialize because of significantly less features than YAML to check for, which enables smaller and lighter code to process JSON. A common misconception is that YAML needs less punctuation and is more compact than JSON but this is completely false. Whitespace is invisible so it seems like there are less characters, but if you count the actual whitespace which is necessary to be there for YAML to be interpreted properly along with proper indentation, you will find YAML actually requires more characters than JSON. JSON doesn't use whitespace to represent hierarchy or grouping and can be easily flattened with unnecessary whitespace removed for more compact transport.
房间里的大象:互联网本身
JavaScript显然以巨大的优势统治着网络,JavaScript开发人员更喜欢使用JSON作为数据格式,以及流行的web api,因此在进行一般意义上的web编程时,很难争论使用YAML还是JSON,因为在团队环境中你可能会被压倒。事实上,大多数web程序员甚至不知道YAML的存在,更不用说考虑使用它了。
如果你正在做任何web编程,JSON是默认的方式,因为使用JavaScript时不需要翻译步骤,所以在这种情况下,你必须提出一个更好的参数来使用YAML而不是JSON。
其他回答
如果您关心更好的解析速度,那么可以选择将数据存储在JSON中。我必须从其他用户修改文件的位置解析数据,因此我使用YAML,因为与JSON相比,它提供了更好的可读性。 你还可以在YAML文件中添加注释,这在JSON文件中是做不到的。
如果你不需要YAML有而JSON没有的任何特性,我更喜欢JSON,因为它非常简单,并且得到广泛支持(有很多语言的库)。YAML更复杂,支持更少。我不认为解析速度或内存使用会有太大的不同,而且可能不是程序性能的主要部分。
摘自:Arnaud Lauret的书《Web api的设计》。”:
JSON数据格式
JSON是一种基于JavaScript编程语言描述数据的文本数据格式,尽管它的名字是JSON,但它完全独立于语言(参见https://www.json.org/)。使用JSON,可以描述包含无序名称/值对的对象,也可以描述包含有序值的数组或列表,如图所示。
An object is delimited by curly braces ({}). A name is a quoted string ("name") and is sep- arated from its value by a colon (:). A value can be a string like "value", a number like 1.23, a Boolean (true or false), the null value null, an object, or an array. An array is delimited by brackets ([]), and its values are separated by commas (,). The JSON format is easily parsed using any programming language. It is also relatively easy to read and write. It is widely adopted for many uses such as databases, configura- tion files, and, of course, APIs.
YAML
YAML (YAML Ain 't Markup Language)是一种人性化的数据序列化格式。和JSON一样,YAML (http://yaml.org)也是一种键/值数据格式。该图显示了两者的比较。
注意以下几点:
在YAML中,属性名和值周围没有双引号(“”)。 JSON的结构花括号({})和逗号(,)被换行符和取代 YAML的压痕。 数组中的括号([])和逗号(,)被破折号(-)和换行符取代 YAML。 与JSON不同,YAML允许以#开头的注释。 将其中一种格式转换为另一种格式相对容易。不过要预先警告,在将YAML文档转换为JSON时会丢失注释。
这个问题已经提出6年了,但奇怪的是,没有一个答案真正解决了这四个问题(速度、内存、表现力、可移植性)。
速度
显然,这是依赖于实现的,但由于JSON被广泛使用,而且很容易实现,因此它往往会得到更好的本机支持,从而提高速度。考虑到YAML所做的一切都是JSON所做的,再加上一卡车的工作量,在两者的任何可比实现中,JSON可能会更快。
然而,考虑到YAML文件可能比JSON文件略小(由于“和”字符更少),在特殊情况下,高度优化的YAML解析器可能会更快。
内存
基本上同样的论点适用。如果YAML解析器表示相同的数据结构,那么很难理解为什么YAML解析器的内存效率会比JSON解析器高。
表达能力
正如其他人所指出的,Python程序员倾向于YAML, JavaScript程序员倾向于JSON。以下是我的看法:
记住JSON的整个语法很容易,因此对理解任何JSON文件的含义都很有信心。YAML不是任何人都能真正理解的。微妙之处和边缘情况的数量是极端的。 由于很少有解析器实现整个规范,因此更难确定给定上下文中给定表达式的含义。 在实践中,JSON中缺乏注释是一个真正的痛苦。
可移植性
很难想象没有JSON库的现代语言。也很难想象一个JSON解析器实现任何低于完整规范的东西。YAML有广泛的支持,但没有JSON那么普遍,而且每个解析器实现一个不同的子集。因此YAML文件的互操作性比您想象的要低。
总结
JSON在性能(如果相关的话)和互操作性方面是赢家。YAML更适合人类维护的文件。HJSON是一个不错的折衷方案,尽管可移植性大大降低。JSON5是一种更合理的折衷方案,具有定义良好的语法。
基准测试结果
下面是在Python和Perl上比较YAML和JSON加载时间的基准测试结果
JSON要快得多,但牺牲了一些可读性和注释等特性
测试方法
在一台快速机器上连续运行100次,平均秒数 数据集是一个3.44MB的JSON文件,包含从维基百科抓取的电影数据 https://raw.githubusercontent.com/prust/wikipedia-movie-data/master/movies.json 链接来源:https://github.com/jdorfman/awesome-json-datasets
结果
Python 3.8.3 timeit
JSON: 0.108
YAML CLoader: 3.684
YAML: 29.763
Perl 5.26.2 Benchmark::cmpthese
JSON XS: 0.107
YAML XS: 0.574
YAML Syck: 1.050
Perl 5.26.2 Dumbbench (Brian D Foy, excludes outliers)
JSON XS: 0.102
YAML XS: 0.514
YAML Syck: 1.027