Json Schema 是什麼?

本文地址:Json Schema 是什麼?git

簡單說,Json Schema 其實就是一個標準的 Json 串,它以一個 Json 串來描述咱們須要的數據規範,而且支持註釋以及驗證 Json 文檔,即咱們能夠用 Json Schema 來驗證所給的 Json 串是否知足咱們須要的數據格式規範。github

一樣能用來表示數據的還有一種格式 XML,爲何 Json Schema 恰恰要用 Json 來進行表示數據呢?對於機器,其實這兩種方式是沒有區別的,機器只要你把標準給了它,它都能用很快的速度識別出來(相對於咱們人),可是 XML 對於人識別就太不友好了。好比,假設咱們須要描述一個班級的兩我的:web

對於 XML:json

<class>
	<name>實驗1班</name>
	<no>1801</no>
	<students>
	    <student>
	        <name>張三</name>
	        <sex>女</sex>
	    </student>
	    <student>
	        <name>李四</name>
	        <sex>男</sex>
	    </student>
	</students>
</class>

使用 Json:數組

{
  "class": {
    "name": "實驗1班",
    "no": "1801",
    "students": {
      "student": [
        {
          "name": "張三",
          "sex": "女"
        },
        {
          "name": "李四",
          "sex": "男"
        }
      ]
    }
  }
}

有沒有以爲 Json 立馬秒殺 XML?這裏可能感受還不是很明顯,這是由於層級比較少,層級再多以後,Json 的優點立馬就顯現出來了。ide

Json Schema 在咱們平時的工做中最經常使用的有兩個,一個就是上面說的用於驗證 Json 串的合法性;另外一個就是用於定義咱們的 API,定義好 API 後,咱們能夠直接用工具生成咱們的 API,這樣利於咱們對 API 的維護。svg

驗證 Json 串的合法性

好比,咱們定義的 Json Schema 爲:工具

{
    "$schema": "http://json-schema.org/draft-04/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,
            "exclusiveMinimum": true
        }
    },
    "required": ["id", "name", "price"]
}

在上述 Json Schema 中ui

  • 最上面的 $shcema 是一個關鍵字,它表示咱們所定義的 Schema 和 http://json-schema.org/draft-04/schema#(Json Schema 的 v4 規範)是一致的
  • title 指的是標題。
  • description 用於描述咱們所定義的 Schema,上述代表咱們定義的是一個來自 Acme 目錄的商品。
  • type 表示咱們定義的是一個 object 對象。
  • properties 中就是 Schema 的屬性了,這裏面的是核心。咱們能夠看到該 Schema 一共有三個屬性,分別是 id(integer), name(string), prince(number)
  • 最後的 required 代表三個屬性都是必須的。

給定了上述 Schema,咱們就能夠驗證給定的 Json 是不是合規的了。好比:code

{
  "id": 1,
  "name": "watermelon"
}

顯然,這個 Json 缺乏了一個屬性 price,因此它不合規。

{
  "id": 1,
  "name": ["knife", "spoon"],
  "price": 4
}

這個 Json 的 name 屬性是一個數組,咱們上面規定 name 只能是 String,顯然這個也不是合規的。

{
  "id": 1,
  "name": "watermelon",
  "price": 4
}

這個,就知足了上面定義的全部規則,所以這個是一個合規的 Json。

定義 API

其實,使用咱們上面的 Json Schema 便能進行 API 的定義了,只不過是定義 API 的話可能還須要更多的支持。好比,對於 Java,咱們須要能實現 extend 等關鍵字的支持,還須要能進行枚舉 enum 類型等的定義。這裏只簡單使用上述的內容顯然不夠了,咱們還須要擴充一些關鍵字的使用。

目前,你們使用最多的將 Json Schema 轉換爲 Java Bean 的一個庫是 jsonschema2pojo,後面我將依託這個庫支持的內容對 Json Schema 的格式進行深刻解析,此庫支持的也是比較通用的。

相關文章
相關標籤/搜索