我发现 JSON 优于 XML 的一大好处是我不必决定如何格式化数据。正如一些人所展示的,有很多方法可以在 XML 中创建简单的数据结构——作为元素、作为属性值等。然后你必须记录它,编写 XML Schema 或 Relax NG 或其他一些废话......一团糟。
XML 可能有其优点,但对于基本的数据交换,JSON 更加紧凑和直接。作为 Python 开发人员,JSON 和 Python 中的简单数据类型之间没有阻抗不匹配。因此,如果我正在为 AJAX 查询编写服务器端处理程序,该查询询问特定滑雪胜地的雪况,我将构建一个如下所示的字典:
conditions = {
'new_snow_24': 5.0,
'new_snow_48': 8.5,
'base_depth': 88.0,
'comments': 'Deep and steep!',
'chains_required': True,
}
return simplejson.dumps(conditions) # Encode and dump `conditions` as a JSON string
当通过 JSON 翻译时(使用 Python 的“simplejson”之类的库),生成的 JSON 结构看起来几乎相同(除了 JSON,布尔值是小写的)。
解码该结构只需要一个 JSON 解析器,无论是用于原生 iPhone 应用程序的 Javascript 或 Objective-C 还是 C# 或 Python 客户端。浮点数将被解释为浮点数,字符串被解释为字符串,布尔值被解释为布尔值。在 Python 中使用“simplejson”库,simplejson.loads(some_json_string) 语句将返回一个完整的数据结构,就像我在上面的示例中所做的那样。
如果我写 XML,我必须决定是写元素还是属性。以下两项均有效:
<conditions>
<new-snow-24>5</new-snow-24>
<new-snow-48>8.5</new-snow-48>
<chains-required>yes</chains-required>
<comments>deep and steep!</comments>
</conditions>
<conditions newSnow24="5" newSnow48="8.5" chainsRequired="yes">
<comments>deep and steep!</comments>
</conditions>
因此,我不仅要考虑可能要发送给客户端的数据,还要考虑如何格式化。 XML 虽然比普通的 SGML 更简单,因为它的规则更加严格,但仍然提供了太多的方式来考虑这些数据。然后我将不得不着手生成它。我不能只拿一个 Python 字典(或其他简单的数据结构)说“把你自己变成我的 XML”。如果不编写自定义解析器,或者不需要 XML Schema/Relax NG 的额外开销和其他类似的痛苦,我无法收到 XML 文档并立即说“让自己进入对象和数据结构”。
简而言之,将数据编码和解码为 JSON 更容易、更直接,尤其是对于快速交换。这可能更适用于来自动态语言背景的人,因为 JavaScript / JSON 中内置的基本数据类型(列表、字典等)直接映射到 Python、Perl、Ruby 等中相同或相似的数据类型。