首页 \ 问答 \ 如何对具有数组的JSON文档使用JSON模式验证?(How to use JSON schema validation against JSON document having arrays?)

如何对具有数组的JSON文档使用JSON模式验证?(How to use JSON schema validation against JSON document having arrays?)

我有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"
         }
      }
   ]
}

I have json document which contains three main elements along with sub elements. These elements also have arrays. I validated this document with json schema but I am not sure if there is any simple way to get rid of repeating schema for arrays as the current schema is too long.

JSON Schema:

{
  "$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"
  ]
}

And JSON document:

{  
   "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"
         }
      }
   ]
}

原文:https://stackoverflow.com/questions/35319757
更新时间:2019-11-29 02:17

最满意答案

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

  1. id必须是绝对URL。 “/”无效
  2. 不要在文档根目录之外的任何地方使用id 。 它有一些意想不到的属性。 最好避免它。
  3. items关键字应该是模式而不是模式数组。 您使用的表单不​​适用于具有单一类型项目的数组。
  4. required关键字仅适用于它出现的模式中的属性。子模式需要定义自己的required属性。
  5. required关键字不适用于数组。 请改用minItemsmaxItems

{
  "$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"]
}

You've got a lot of issues with this schema. I suggest you read http://spacetelescope.github.io/understanding-json-schema/ to get a better understanding of JSON Schema. Below is the corrected schema. I'll give some brief advice, but not a lot of explanation. Go read that link for more info.

  1. id is required to be a absolute URL. "/" is not valid
  2. Don't use id anywhere other than the root of the document. It has some unexpected properties. It's best to just avoid it.
  3. The items keyword should be a schema not an array of schemas. The form you are using is not intended for arrays with a single type of item.
  4. The required keyword applies only to properties in the schema it appears in. Sub-schemas need to define their own required properties.
  5. The required keyword does not work on arrays. Use minItems and maxItems instead.

{
  "$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"]
}
2016-02-12

相关文章

更多

最新问答

更多
  • jsPlumb draggable element javascript函数(jsPlumb draggable element javascript function)
  • MVC4:ViewModel(带有radiobuttonlist)在HttpPost之后为空(MVC4: ViewModel (with radiobuttonlist) is empty after HttpPost)
  • 如何在同一帐户上设置“Dev repo”(在prod和团队之间)(How to set up a “Dev repo” (between the prod and the team) on the same account)
  • 如何在tcl中将eth0配置为发送方udp端口(how to configure eth0 as a sender udp port in tcl)
  • 如何在datarow []中的列中找到最大值?(How to find max value in a column in a datarow[] ?)
  • 如何使用预定义文本替换来自数据库的部分结果(How do I replace part of result coming from Database with predefined text)
  • Selenium Java注入了新的Javascript函数(Selenium Java inject new Javascript function)
  • 使用.on的多个下拉菜单选择文本仅适用于第一个下拉列表(Multiple Dropdowns Menu Selection text using .on works only on first dropdown)
  • 快速将黄土曲线添加到大型数据集图中的方法(Quick way to add loess curve to large data set graph)
  • FilteringSelect in mvc(FilteringSelect in mvc)
  • 在Delphi XE2中开发Mac或iOS应用程序需要哪些硬件/软件?(What hardware/software is necessary to develop Mac or iOS apps in Delphi XE2?)
  • 在原型的构造函数中初始化属性时获取“未定义”(Getting 'undefined' when a property is initialized in the constructor of a prototype)
  • 通过越狱加载的应用程序的Documents文件夹位置(Location of Documents folder for an app loaded via jailbreak)
  • 在OpenGL中使用可编程和固定管道功能(Using both programmable and fixed pipeline functionality in OpenGL)
  • 将任何用户输入重定向到单独的底层程序(redirect any user input to a separate underlying program)
  • 编辑文本不能正常工作android(Edit texts not working properly android)
  • “user_denied”Facebook应用页面上的Facebook用户区域设置(Facebook user locale on “user_denied” facebook app page)
  • 在大图像中找到小的部分透明图像的坐标(find coordinates of small partially-transparent image within a large image)
  • 我如何在cakephp 3.1中获得完整的相对路径?(How i can get full relative path of image in cakephp 3.1?)
  • 如何保存拖动标记的新本地化?(How to save new localization of dragged marker?)
  • MySQL UPDATE vs INSERT和DELETE(MySQL UPDATE vs INSERT and DELETE)
  • 在执行查询之前,在SQLAlchemy模型中将datetime转换为unix时间戳?(Convert datetime to unix timestamp in SQLAlchemy model before executing query?)
  • OpenCL与OpenGL互操作的优势(Advantage of OpenCL interoperability with OpenGL)
  • 如何解析用点和等分隔的数据然后添加到listview(How to parsing data from delimited with dot and equal then add to listview)
  • 带调试输出的X3解析器段错误(BOOST_SPIRIT_X3_DEBUG)(X3 parser segfaults with debug output (BOOST_SPIRIT_X3_DEBUG))
  • 将文件夹名称添加到fgrep结果(Add folder name to fgrep result)
  • 在MySQL中加载一个表是非常慢的(Loading one table in MySQL is ridiculously slow)
  • 如何将JSON放入PHP变量?(How do I put JSON into a PHP Variable?)
  • 如何绕过Microsoft.Speech.Recognition中的不流畅?(How to bypass disfluencies in Microsoft.Speech.Recognition?)
  • 原点的最后一行是什么?(What is the last row of an origin for?)