本文部分內容來自 《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
關鍵字用來表示必填欄位。
從而,對於上述的第一個問題和第二個問題,我們就可以很好地解決了。對於第三個問題,我們可以通過 minimum
、maxLength/minLength
、exclusiveMinimum
來解決。
下面就是一個驗證通過的 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 作為靜態配置檔案。