Json-schema簡介和應用

yesye發表於2021-09-09
Json?

瞭解json schema首先要知道什麼是json?
json 是 JavaScript Object Notation 的縮寫,它是一種簡化的資料交換格式,是目前網際網路服務間進行資料交換最常見的一種交換格式,具有簡潔、可讀性好等特點。

在json中常見的資料型別主要包括

  • object

    { "key1": "value1", "key2": "value2" }

  • array

    [ "first", "second", "third" ]

  • number

    42
    3.1415926

  • string

    "This is a string"

  • boolean

    true
    false

  • null

    null

一個示例json格式比如:

{
  "fruits": [ "apple", "orange", "pear" ],
  "vegetables": [
    {
      "veggieName": "potato",
      "veggieLike": true
    },
    {
      "veggieName": "broccoli",
      "veggieLike": false
    }
  ]
}
何為Json Schema

如前文所述,json是目前應用非常廣泛的資料狡猾格式。既然是用於資料交換的格式,那麼就存在資料交換的是雙方,如何約定或校驗對方的資料格式符合要求,就成了服務互動需要解決的一個問題。所以Json Schema就是用來定義json資料約束的一個標準。根據這個約定模式,交換資料的雙方可以理解json資料的要求和約束,也可以據此對資料進行驗證,保證資料交換的正確性。

目前最新的Json-schema版本是draft 7,釋出於2018-03-19。下面我們就以官網的一個例項來看看Json-schema是如何進行資料約束以及其應用

如下是一個schema例項:

{
  "$schema": "",
  "$id": "",
  "title": "Product",
  "description": "A product from Acme's catalog",
  "type": "object",
  "properties": {
    "productId": {
      "description": "The unique identifier for a product",
      "type": "integer"
    },
    "productName": {
      "description": "Name of the product",
      "type": "string"
    },
    "price": {
      "description": "The price of the product",
      "type": "number",
      "exclusiveMinimum": 0
    },
    "tags": {
      "description": "Tags for the product",
      "type": "array",
      "items": {
        "type": "string"
      },
      "minItems": 1,
      "uniqueItems": true
    },
    "dimensions": {
      "type": "object",
      "properties": {
        "length": {
          "type": "number"
        },
        "width": {
          "type": "number"
        },
        "height": {
          "type": "number"
        }
      },
      "required": [ "length", "width", "height" ]
    }
  },
  "required": [ "productId", "productName", "price" ]
}

分析說明:

  "$schema": "",

說明當前使用的schema版本,可以不包含

  "$id": "",

當前schema的唯一id標識,一般指向一個自主域名。方便後續引用,可以不包含

  "title": "Product",

當前schema的標題,簡要描述資訊,可不包含

"description": "A product from Acme's catalog",

詳細描述資訊,可不包含

"type": "object",

約束物件是object,也就是在 { } 中的資料

"properties": {
    "productId": {
      "description": "The unique identifier for a product",
      "type": "integer"
    },

object中具體屬性的約束,description是描述資訊,不產生具體約束。
type約束productid屬性型別為整型

 "productName": {
      "description": "Name of the product",
      "type": "string"
    },

約束productName屬性型別為字元型

    "price": {
      "description": "The price of the product",
      "type": "number",
      "exclusiveMinimum": 0
    },

約束price屬性型別為數字型,可以是整型或浮點型。
exclusiveMinimum約束該數字>0(不包含0)

    "tags": {
      "description": "Tags for the product",
      "type": "array",
      "items": {
        "type": "string"
      },
      "minItems": 1,
      "uniqueItems": true
    },

約束tag屬性是array陣列。items是陣列項約束,這裡約束陣列項均為字元型
minItems陣列至少包含1項。
uniqueItems約束陣列中每項不得重複

    "dimensions": {
      "type": "object",
      "properties": {
        "length": {
          "type": "number"
        },
        "width": {
          "type": "number"
        },
        "height": {
          "type": "number"
        }
      },
  "required": [ "length", "width", "height" ]
    }
  },

約束dimensions巢狀物件,其中length,width,height均為數字型別
且這三個欄位在dimensions物件中必須包含

 "required": [ "productId", "productName", "price" ]

當前資料物件必須包含productId,productName,price三個欄位

以上是對Json-Schema的簡要說明,詳細介紹大家可以關注後續更新和相關實戰課。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2041/viewspace-2806809/,如需轉載,請註明出處,否則將追究法律責任。

相關文章