JSON 必知必會

小可嗒嗒發表於2018-04-04

本文部分內容來自 《Introduction to JavaScript Object Notation》,www.json.org/

JSON (JavaScript Object Notation),是一種輕量級的資料交換格式來源源於 JavaScript 的一個子集。但是它獨立於程式語言。JSON 之父是 Douglas Crockford

標準的 JSON 語法

JSON 標準語法基於兩種結構:

  • name/value pairs
  • ordered list of values,一般就是陣列

與 JavaScript 物件的區別

值得注意的是,雖然 JSON 源於 JavaScript 的子集,但是基於目前的發展,有些 JavaScript 物件不是 JSON,有些 JSON 並不是 JavaScript 物件來源

  • JSON 屬性名稱使用雙引號,而 JavaScript 物件的屬性可以不使用、使用單引號或者雙引號。
  • JavaScript 物件中常包含方法(函式),JSON 不會涉及物件字面量中的函式。

JSON 驗證工具

下面提供幾個 JSON 線上驗證的網站:

JSON 的媒體型別

JSON 的 MIME 型別是 application/json

JSON 的資料型別

物件資料型別

非常簡單,就是花括號包裹的 name/value 對。是一種複合資料型別。

字串型別

{
    "title": "xiaoke love yuer"
}
複製程式碼

注意轉義

數字型別

{
    "age": 25,
    "earthMass": 5.97219e+24,
    "decimal": 2.3,
    "negativeNumber": -122.23
}
複製程式碼

可以是整數、小數、負數或者指數。

boolean 型別

{
    "xiaokeLoveYuer": true
}
複製程式碼

null 型別

{
    "color": null
}
複製程式碼

null 可以用來表達的意思。需要注意的是,json 中沒有 undefined 型別。

陣列型別

陣列型別就是值構成的列表和集合。一般來說,陣列中的值應具有相同的資料型別(不是必須,而是為了可移植性)。陣列型別也是複雜資料型別。

{
    "name":[
        "xiaoke","yuer"
    ]
}
複製程式碼

比如這種:

[
    {
        "title": "xiaoke love yuer",
        "xiaokeLoveYuer": true
    },
    {
        "title": "yuer love xiaoke",
        "yuerLovexiaoke": true
    }
]
複製程式碼

JSON Schema

JSON Schema,即 JSON 的一致性驗證 (conformity validation)。之前提到的 JSON 驗證器是確保 JSON 不存在語法錯誤,而 JSON 的一致性檢查意在確保資料符合要求。主要有三點驗證:

  • 值的資料型別是否正確
  • 是否包含所需要的資料
  • 值的形式是不是需要的

JSON Schema 還處於草案當中,官網地址是 json-schema.org/

這是一個摘自官網的例子:

{
    "$schema": "http://json-schema.org/draft-06/schema#",
    "title": "Product",
    "description": "A product from Acme's catalog",
    "type": "object",
    "properties": {
        "id": {
            "description": "The unique identifier for a product",
            "type": "integer"
        },
        "name": {
            "description": "Name of the product",
            "type": "string"
        },
        "price": {
            "type": "number",
            "minimum": 0
        }
    },
    "required": ["id", "name", "price"]
}
複製程式碼

上面的程式碼是一個 Production Schema,也是一個 JSON。內容有點長,待我一步一步解釋。

  • $schema 關鍵字
{
    "$schema": "http://json-schema.org/draft-06/schema#"
}
複製程式碼

宣告其為一個 schema 檔案,值為所用 draft 版本的連結,因為還處於草案階段。

  • title 關鍵字
{
    "title": "Product"
}
複製程式碼

JSON Schema 的標題。這是個描述性的關鍵字,和 description 一樣,用於 JSON Schema 的描述,不施加任何驗證性內容。

  • type 關鍵字
{
    "type": "object"
}
複製程式碼

type 關鍵字用於對 JSON 資料型別的限制。

  • properties 關鍵字

properties 關鍵字就是我們想要的 JSON 的 name/value 對。

  • required 關鍵字

required 關鍵字用來表示必填欄位。

從而,對於上述的第一個問題和第二個問題,我們就可以很好地解決了。對於第三個問題,我們可以通過 minimummaxLength/minLengthexclusiveMinimum 來解決。

下面就是一個驗證通過的 JSON:

{
"id": 1,
"name": "xiaokeloveyuer",
"price": 4
}
複製程式碼

JSON 序列和反序列化

JSON 物件擁有兩個方法:stringify()parse()

  • stringify() 將 JavaScript 序列化為 JSON 字串。這叫序列化,本意是將物件轉換為文字的過程。
  • parse() 將 JSON 字串解析為原生 JavaScript 物件。這叫反序列化,也叫解析,是將文字轉換為物件的過程。

JSON 中的安全問題

暫時略。


JSON 的其他應用場景

與資料庫互動

伺服器端的 JSON

作為配置檔案

作為靜態配置檔案也讓 JSON 大放異彩。比如 npm 的 package.json 檔案,VSCode 都採用 JSON 作為靜態配置檔案。

相關文章