最近看了《JSON必知必會》,做些記錄。其實主要是想講講語法驗證和一致性驗證。
文末亦有書籍的相關信息(書名,作者,ISBN)。
基礎知識
老司機可以跳過這段
什么是JSON。JSON是一種數據交換格式。數據交換格式是一種在不同平臺間傳遞數據的文本格式。除JSON外,你也可能聽說過XML這種數據交換格式。像XML和JSON這樣的數據交換格式非常重要,我們需要它們來實現不同系統間的數據交換。
JSON是一種被許多系統用于交換數據格式的數據交換格式,但不是所有的系統都支持使用JSON來交換數據。
JSON的全稱是Javascript Object Notation(Javascript對象表示法)。JSON基于Javascript對象字面量。JSON獨立于編程語言(你不必先學習JS)。
當然如果你會JS,那就再好不過了。
什么是表示法
一個用于表示諸如數字或單詞等數據的字符系統
什么是字面量
所謂字面量,是對數據值的具體表示。它的字面意思與其想要表達的意思完全一致。
a=5
a=a+5
a的值是10,是一個變量。這里,5就是5,是字面量
JSON的表示形式是名稱-值對。也叫鍵-值對,屬性-值對,或者字段-值對。
JSON中使用冒號(:)來分隔名稱和值。名稱始終在左側,值始終在右側。
比如,使用JSON來描述我的內褲
{
"brand":"CK",
"Color":"black",
"size":23
}
JSON中的名稱-值對列表被花括號包裹
名稱必須被雙引號包裹,而值并不是總是需要被雙引號包裹。
當值是字符串時,必須使用雙引號。而在json中,還有數字、布爾值、數組、對象、null等其他數據類型,而這些都不應該被雙引號包裹。
雙引號中的名稱可以是任何有效的字符串,例如
"My animal":"cat"
"Sail's animal":"dog"
在JSON中是完全合法的。但是最好不要這樣做。
因為,JSON中的名稱-值對是一種對許多系統都十分友好的數據結構,而使用空格和特殊字符(字母和數字以外)忽略了可移植性(以一種雙方系統都兼容的方式在平臺間傳遞信息)。如果我們這樣做的話,會降低JSON數據的可移植性
JSON文件
JSON這種數據交換格式是可以作為獨立的文件存在于文件系統中的。它的文件擴展名非常好記.json。
JSON的媒體類型
媒體類型也叫作,互聯網媒體類型,內容類型,MIME類型
它使用“類型/子類型”這種格式來表示,比如text/html
JSON的MIME類型是application/json
JSON中的布爾類型
只能使用小寫 true或false,其他的TRUE/FALSE都是錯誤的
JSON中的null類型,也必須使用小寫
語法驗證
語法驗證關注的是JSON的格式,檢測我們的JSON語法是否正確(是否被被花括號包括,名稱-值對是否以逗號分隔)。
JSON語法驗證工具
這是一個帶有配置選項、能夠高亮錯誤且UI很棒的格式化工具。經過處理的JSON會顯示在兩個窗口,一個用于展示JSON的樹/節點結構,類似于可視化工具,另一個用于復制/粘貼格式化后的代碼
這是一個集驗證、格式化和可視化工具于一身的JSON工具。錯誤提示會顯示在出錯的那一行。除了驗證以外,還會顯示解析錯誤的詳情,右邊的可視化工具使用樹/節點的形式來展示JSON。
這是一個毫不花哨的JSON驗證工具。簡單的復制、粘貼、驗證即可。也可以友好地格式化你的JSON。
以上都是語法驗證工具。
一致性驗證關注的是其獨特的數據結構,會檢測我們的數據是否包含name,breed和age等信息。它還會檢測
age的值是不是數字,name的值是不是字符串,等等......
一致性驗證
JSON驗證器負責驗證語法錯誤,JSON Schema負責提供一致性驗證。
JSON Schema(Schema意為模式),數據交換中的一種虛擬“合同”。
JSON Schema是數據接收方的第一道防線,也是數據發送方節約時間、保證數據正確的好工具。
JSON Schema可以解決以下有關一致性驗證的問題
值的數據類型是否正確?
可以具體規定一個值是數字、字符串類型是否包含數據所需要的數據?
可以具體規定哪些數據是需要的,哪些是不需要的值的形式是不是我需要的?
可以指定范圍、最小值和最大值
盡管JSON已經相當成熟,但JSON Schema仍在開發當中。截至2015年4月,JSON Schema最新版是草擬版本4。當然這并不意味著你現在不可以使用它,這僅僅說明了它仍舊在成長當中,且將來會做得更好。
JSON Schema使用JSON來書寫,所以幾步就能掌握它。
首先,需要在JSON第一個名稱-值對中,聲明一個schema文件。
{
"$schema": "http://json-schema.org/draft-04/schema#"
}
第二個名稱-值對,應該是JSON Schema文件的標題
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title":"cat"
}
第三個名稱-值對,要定義需要在JSON中包含的屬性。"properties"的值實質上是我們想要的JSON的名稱-值對的骨架。
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title":"cat",
"properties":{
"name":{
"type":"string"
},
"age":{
"type":"number",
"description":"your cat's age in years."
},
"declawed":{
"type":"boolean"
},
"description":{
"type":"string"
}
}
}
如果想實現某些字段不能漏填,需要加上在"$schema","title","properties"后面加上第四個名稱-值對,它的名稱是
"required",值為一個數組,數組中包含必填字段。
假設"name","age","declawed"是必填字段,所以把它們加入數組。"description"不是必填字段,就不應加入數組
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title":"cat",
"properties":{
"name":{
"type":"string"
},
"age":{
"type":"number",
"description":"your cat's age in years."
},
"declawed":{
"type":"boolean"
},
"description":{
"type":"string"
}
},
"required":[
"name",
"age",
"declawed"
]
}
例如
{
"name":"Fluffy",
"age":2,
"declawed":"false",
"description":"hello world."
}
{
"name":"Fluffy",
"age":2,
"declawed":"false"
}
以上兩個都是合法的JSON。
需要提一下的是,如果你JSON Schema中不包含"required"名稱-值對,那么將不會有必填項。一個沒有任何名稱-值對的空JSON對象也被認為是合法的。例如
{}
也是合法的JSON。
現在還有一個問題,值的形式是不是我們所需要的?比如用戶名不能超過30個字符,年齡不為負數等。
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title":"cat",
"properties":{
"name":{
"type":"string",
"minLength":3,
"maxLength":20
},
"age":{
"type":"number",
"description":"your cat's age in years.",
"minmum":0
},
"declawed":{
"type":"boolean"
},
"description":{
"type":"string"
}
},
"required":[
"name",
"age",
"declawed"
]
}
以上只是JSON Schema的冰山一角,JSON Schema還支持正則表達式等。
如果你希望深入了解掌握JSON Schema,可以訪問以下鏈接
JSON Schema在線檢測工具
《JSON必知必會》一書還講到了一些安全方面的問題,跨站請求偽造,注入攻擊等。
有興趣的話可以買來看看。
<i>Introduction to Javascript Object Notation<i/> by Lindsay Bassett(O'Reilly).
Copyright 2015 Lindsay Bassett,978-1-491-92948-3.
![Uploading JSONbzbh_032355.png . . .]
** 本文已經更新在我的個人博客 ,歡迎訪問**
** 未經授權,禁止轉載**