JSON 入门笔记

继续读 O’Reilly 的入门系列图书,这次是 Lindsay Bassett 的 Introduction to JavaScript Object Notation: A To-the-point Guide to JSON,非常薄,只有一百页出头。本文是我对这本书的简单笔记,信息量不多。

JSON = JavaScript Object Notation,是一种数据交换格式。

虽然 JSON 名字与 JavaScript 有关,它实际上不依赖任何语言,只是基于 JavaScript 的对象字面量的形式。

JSON 使用键值对表示属性数据,每个键是一个属性名称,值是相应的字面量,也可以是数组或者嵌套的对象。

例如生活中如何描述一双鞋,写成规范的 JSON 格式(双引号、冒号、逗号、花括号)

{
    "brand": "Crocs",
    "color": "pink",
    "size": 9,
    "hasLaces": false,
    "laceColor": null
}

包含特殊字符的字符串,注意做转义处理。

{
    "story": "Say \"Hi!\" to your cat \\n every day."
}

除了基本的语法检查以外,对数据类型、范围的一致性检查也很重要,即 JSON Schema 验证

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "title": "Shoes",
    "properties": {
        "brand": {
            "type": "string",
            "minLength": 3,
            "maxLength": 20
            },
        "size": {
            "type": "number", 
            "description": "UK shoe size",
            "minimum": 0
            },
        "hasLaces": {"type": "boolean"},
        "description": {"type": "string"}
    },
    "required": ["brand", "size", "hasLaces"]
}

定义这样的 Schema 之后,就可以确认一段 JSON 是否符合它的规范。

下面是一些安全相关事项。因为不做 web 开发,这部分只是简单记录,没有深入探究。

如果网站使用 JSON 来传递敏感信息,有可能被 Cross-Site Request Forgery (CSRF) 盗取利用。比如银行网站使用 top-level JSON array,那么它既是有效的 JSON,又是 JavaScript 脚本,在登陆银行网站之后打开钓鱼网站,在 js 上做手脚盗取这段信息

[
    {"user": "bobbarker"},
    {"phone": "555-555-5555"}
]

银行网站应该采取更安全的做法,使它只是一个 JSON 对象而不是有效的 JavaScript 脚本,并且只允许 POST 而禁止 GET 直连

{
    "info": [
        {"user": "bobbarker"},
        {"phone": "555-555-5555"}
    ]
}

要想在 JavaScript 中将 JSON 字符串转化为 js 对象,不应该使用可能执行恶意代码的危险的 eval("(" + jsonString + ")"),而应该使用更安全的 JSON.parse(jsonString),避免注入攻击。此外还要注意 JSON 字符串是否包含 HTML。

在 NoSQL 数据库中,document store 是以 XML 或 JSON 的格式存储数据的,例如 CouchDB 的每一条记录是一条 JSON 文档,使用 HTTP API 和 JavaScript 查询。

书中还介绍了 XMLHttpRequest、jQuery、AngularJS 及其服务器端如何处理 JSON 等内容,与我关系不大所以略过。

作为 Python 用户,我使用 JSON 主要是做配置文件。下面将 JSON 与 INI、XML 以及书中没提到的 YAML 格式进行比较

  • 可读性:YAML >= INI > JSON » XML
  • 对于复杂的数据的灵活表示,例如列表和嵌套:YAML > JSON » XML » INI
  • YAML 支持注释,JSON 不支持
  • 一般来说 YAML 用于配置,JSON 更多用于数据交换
  • JSON 更简单,容易解析,也更快


Previous     Next
sighsmile /
Published under (CC) BY-NC-SA