JSON必知必會

最近看了《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 . . .]

** 本文已經更新在我的個人博客 ,歡迎訪問**
** 未經授權,禁止轉載**

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容