如何对具有数组的JSON文档使用JSON模式验证?

时间:2016-02-10 15:51:04

标签: json jsonschema

我有json文档,其中包含三个主要元素以及子元素。这些元素也有数组。我使用json模式验证了这个文档,但是我不确定是否有任何简单的方法可以摆脱重复的数组模式,因为当前的模式太长了。

JSON架构:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "/",
  "type": "object",
  "properties": {
    "book": {
      "id": "book",
      "type": "array",
      "items": [
        {
          "id": "0",
          "type": "object",
          "properties": {
            "isbn": {
              "id": "isbn",
              "type": "string"
            },
            "title": {
              "id": "title",
              "type": "string"
            },
            "price": {
              "id": "price",
              "type": "string"
            },
            "categories": {
              "id": "categories",
              "type": "array",
              "items": [
                {
                  "id": "0",
                  "type": "object",
                  "properties": {
                    "category": {
                      "id": "category",
                      "type": "string"
                    }
                  }
                },
                {
                  "id": "1",
                  "type": "object",
                  "properties": {
                    "category": {
                      "id": "category",
                      "type": "string"
                    }
                  }
                },
                {
                  "id": "2",
                  "type": "object",
                  "properties": {
                    "category": {
                      "id": "category",
                      "type": "string"
                    }
                  }
                }
              ]
            },
            "warehouse": {
              "id": "warehouse",
              "type": "object",
              "properties": {
                "location": {
                  "id": "location",
                  "type": "string"
                },
                "aisle": {
                  "id": "aisle",
                  "type": "string"
                },
                "shelf": {
                  "id": "shelf",
                  "type": "string"
                }
              }
            }
          },
          "required": [
            "isbn",
            "title",
            "price",
            "categories",
            "category",
            "warehouse"
          ]
        },
        {
          "id": "1",
          "type": "object",
          "properties": {
            "isbn": {
              "id": "isbn",
              "type": "string"
            },
            "title": {
              "id": "title",
              "type": "string"
            },
            "price": {
              "id": "price",
              "type": "string"
            },
            "categories": {
              "id": "categories",
              "type": "array",
              "items": [
                {
                  "id": "0",
                  "type": "object",
                  "properties": {
                    "category": {
                      "id": "category",
                      "type": "string"
                    }
                  }
                },
                {
                  "id": "1",
                  "type": "object",
                  "properties": {
                    "category": {
                      "id": "category",
                      "type": "string"
                    }
                  }
                },
                {
                  "id": "2",
                  "type": "object",
                  "properties": {
                    "category": {
                      "id": "category",
                      "type": "string"
                    }
                  }
                }
              ]
            },
            "warehouse": {
              "id": "warehouse",
              "type": "object",
              "properties": {
                "location": {
                  "id": "location",
                  "type": "string"
                },
                "aisle": {
                  "id": "aisle",
                  "type": "string"
                },
                "shelf": {
                  "id": "shelf",
                  "type": "string"
                }
              }
            }
          }
        },
        {
          "id": "2",
          "type": "object",
          "properties": {
            "isbn": {
              "id": "isbn",
              "type": "string"
            },
            "title": {
              "id": "title",
              "type": "string"
            },
            "price": {
              "id": "price",
              "type": "string"
            },
            "categories": {
              "id": "categories",
              "type": "array",
              "items": [
                {
                  "id": "0",
                  "type": "object",
                  "properties": {
                    "category": {
                      "id": "category",
                      "type": "string"
                    }
                  }
                },
                {
                  "id": "1",
                  "type": "object",
                  "properties": {
                    "category": {
                      "id": "category",
                      "type": "string"
                    }
                  }
                },
                {
                  "id": "2",
                  "type": "object",
                  "properties": {
                    "category": {
                      "id": "category",
                      "type": "string"
                    }
                  }
                }
              ]
            },
            "warehouse": {
              "id": "warehouse",
              "type": "object",
              "properties": {
                "location": {
                  "id": "location",
                  "type": "string"
                },
                "aisle": {
                  "id": "aisle",
                  "type": "string"
                },
                "shelf": {
                  "id": "shelf",
                  "type": "string"
                }
              }
            }
          }
        }
      ],
      "required": [
        "0",
        "1",
        "2"
      ]
    }
  },
  "required": [
    "book"
  ]
}

和JSON文件:

{  
   "book":[  
      {  
         "isbn":"0-672-33751-7",
         "title":"Unity Game Development",
         "price":"$55.99",
         "categories":[  
            {  
               "category":"Game Development"
            },
            {  
               "category":"Unit Game Engine"
            },
            {  
               "category":"Beginner to Intermediate"
            }
         ],
         "warehouse":{  
            "location":"North Warehouse",
            "aisle":"A16",
            "shelf":"3"
         }
      },
      {  
         "isbn":"978-0-9871530-7-4",
         "title":"Jquery: Novice to Ninja",
         "price":"$39.95",
         "categories":[  
            {  
               "category":"JavaScript"
            },
            {  
               "category":"jQuery"
            },
            {  
               "category":"Web Development"
            }
         ],
         "warehouse":{  
            "location":"North Warehouse",
            "aisle":"W03",
            "shelf":"6"
         }
      },
      {  
         "isbn":"0-538-74477-4",
         "title":"Programming Logic and Design",
         "price":"$89.99",
         "categories":[  
            {  
               "category":"Programming"
            },
            {  
               "category":"JavaScript"
            },
            {  
               "category":"Computer Logic"
            }
         ],
         "warehouse":{  
            "location":"South Warehouse",
            "aisle":"B44",
            "shelf":"1"
         }
      }
   ]
}

1 个答案:

答案 0 :(得分:1)

这个架构存在很多问题。我建议你阅读http://spacetelescope.github.io/understanding-json-schema/以更好地理解JSON Schema。以下是更正后的架构。我会给出一些简短的建议,但不是很多解释。请阅读该链接以获取更多信息。

  1. id必须是绝对网址。 “/”无效
  2. 请勿在文档根目录以外的任何位置使用id。它有一些意想不到的属性。最好避免它。
  3. items关键字应该是架构而不是架构数组。您使用的表单不​​适用于具有单一类型项目的数组。
  4. required关键字仅适用于其显示的架构中的属性。子架构需要定义自己的required属性。
  5. required关键字对数组不起作用。请改用minItemsmaxItems
  6. {
      "$schema": "http://json-schema.org/draft-04/schema#",
      "type": "object",
      "properties": {
        "book": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "isbn": { "type": "string" },
              "title": { "type": "string" },
              "price": { "type": "string" },
              "categories": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "category": { "type": "string" }
                  },
                  "required": ["category"]
                }
              },
              "warehouse": {
                "type": "object",
                "properties": {
                  "location": { "type": "string" },
                  "aisle": { "type": "string" },
                  "shelf": { "type": "string" }
                }
              }
            },
            "required": [
              "isbn", "title", "price", "categories", "warehouse"
            ]
          }
        }
      },
      "required": ["book"]
    }