小智 50
YAML是JSON的100%超集,因此拒绝YAML然后考虑使用JSON是没有意义的.YAML完成了JSON所做的一切,但是YAML也提供了更多功能(如引用).
我无法想象除了使用DTD验证文档之外,XML无法做到的任何事情,根据我的经验,从来没有值得花费开销.但是YAML比XML更快更容易打字和阅读.
至于属性或属性,如果你考虑它,它们并不真正"添加"任何东西......它只是一个符号快捷方式,可以将某些内容写为节点的属性,而不是将其放在自己的子节点中.但是如果您喜欢这种便利,您通常可以使用YAML的内联列表/哈希来模拟它.例如:
<!-- XML -->
<Director name="Spielberg">
<Movies>
<Movie title="Jaws" year="1975"/>
<Movie title="E.T." year="1982"/>
</Movies>
</Director>
# YAML
Director:
name: Spielberg
Movies:
- Movie: {title: E.T., year: 1975}
- Movie: {title: Jaws, year: 1982}
Run Code Online (Sandbox Code Playgroud)
对我来说,无需编写每个节点标签两次的奢侈,加上所有角度支架垃圾的自由,使YAML成为首选.我实际上也喜欢缺少正式的标签属性,因为在我看来,这似乎是一个灰色的XML区域,它不必要地引入两组语法(在编写和遍历时),基本上是相同的概念.YAML完全消除了这种困惑.
这里没有提到Prolog,但它是我所知道的表示数据的最佳格式.Prolog程序本质上描述了实体之间复杂关系的数据库.Prolog很容易解析,其中唯一的竞争对手就是这个域中的S表达式.
程序员经常"忘记"XML实际包含的内容.通常指的是它的一小部分.XML是一种非常复杂的格式,至少包含以下部分:DTD模式语言,XSD模式语言,XSLT转换语言,RNG模式语言和XPath(以及XQuery)语言 - 它们都是XML标准的一部分.另外,还有像E4X这样的伪经.它们中的每一个都有自己的版本,相当多的重叠,不兼容等.很少有XML解析器实现所有这些.更不用说流行解析的多个怪癖和错误,其中一些会导致显着的安全问题,如https://en.wikipedia.org/wiki/XML_external_entity_attack.
因此,寻找XML 替代方案并不是一个好主意.你可能根本不想处理类似的XML.
YAML可能是第二差的选择.它没有XML那么大,但它的设计也试图覆盖所有基础...每次超过十次......以不同的方式,没有人能想到的.我还没有听说过正常工作的YAML解析器.红宝石,使用YAML很多的语言,已经著名搞砸了的缘故吧.我见过的所有YAML解析器都是libyaml的副本,它本身是一个手写的(不是从形式描述生成的)解析器类型,其代码很难验证其正确性(函数跨越数百个)具有复杂控制流的线).正如已经提到的,它完全包含JSON ...在少数Unicode编码技术之上......在同一个文档中,可能还有一些你不想听到的其他东西.
另一方面,JSON与其他两个完全不同.您可以在等待从Maven Nexus下载JSON解析器artefact时编写JSON解析器.它可以做很少,但至少你知道它的能力.没有惊喜.(除了与字符串和双精度编码中的字符转义相关的一些差异).没有隐蔽的攻击.你不能在其中写评论.多行字符串看起来很糟糕.无论您通过属性和属性之间的区别来表达什么,您都可以通过更多嵌套字典来实现.
假设,虽然你想要正确的XML冤枉......好吧,那么像YAML或JSON这样的流行东西都不会这样做.在七十年代中期的一段时间里,时尚与理性思维在某种程度上分道扬.. 那么,你将不得不回到McCarthy,Hoare,Codd和Kowalski开始的所有地方,找出你想要代表什么,然后看看什么是最好的表现技术,无论你是什么试图代表:)
我发现S-Expressions是表示结构化数据的好方法.这是一种非常简单的格式,易于生成和解析.它不支持属性,但是像YAML和JSON一样,它不需要.属性只是XML限制冗长的一种方式.更简单,更清晰的格式就是不需要它们.
AXON涵盖了XML 和 JSON 的优点。让我们用几个例子来解释这一点。
AXON 可以被视为 XML 数据的较短形式。
XML
<person>
<name>Frank Martin</name>
<age>32</age>
</person>
Run Code Online (Sandbox Code Playgroud)
轴突
person{
name{"Frank Martin"}
age{32}}
Run Code Online (Sandbox Code Playgroud)
XML
<person name="Frank Martin" age="32" />
Run Code Online (Sandbox Code Playgroud)
轴突
person{name:"Frank Martin" age:32}
Run Code Online (Sandbox Code Playgroud)
AXON 包含某种形式的 JSON。
JSON
{"name":"Frank Martin" "age":32 "birth":"1965-12-24"}
Run Code Online (Sandbox Code Playgroud)
轴突
{name:"Frank Martin" age:32 birth:1965-12-24}
Run Code Online (Sandbox Code Playgroud)
AXON 可以表示类 XML 和类 JSON 数据的组合。
轴突
table {
fields {
("id" "int") ("val1" "double") ("val2" "int") ("val3" "double")
}
rows {
(1 3.2 123 -3.4)
(2 3.5 303 2.4)
(3 2.3 235 -1.2)
}
}
Run Code Online (Sandbox Code Playgroud)
现在有可用的 python 库pyaxon。
| 归档时间: |
|
| 查看次数: |
23731 次 |
| 最近记录: |