无法验证儿童json-schema

时间:2017-03-21 17:45:08

标签: json jsonschema json-schema-validator

我正在研究像这样的json架构:

{
  "$schema": "http://json-schema.org/schema#",
  "title": "Layout",
  "description": "The layout created by the user",
  "type": "object",
  "definitions": {
    "stdAttribute": {
      "type": "object",
      "required": ["attributeName","attributeValue"],
      "properties": {
        "attributeValue": {
          "type": "string"
        },
        "attributeName": {
          "type": "string"
        }
      }
    },
    "stdItem": {
      "type": "object",
      "required" : ["stdType","stdAttributes"],
      "properties": {
        "stdType": {
          "enum": [
            "CONTAINER",
            "TEXT",
            "TEXTAREA",
            "BUTTON",
            "LABEL",
            "IMAGE",
            "MARCIMAGE",
            "DATA",
            "SELECT",
            "TABLE"
          ]
        },
        "stdAttributes": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/stdAttribute"
          },
          "minItems": 1
        },
        "children": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/stdItem"
          }
        }
      }
    }
  },
  "properties":{
    "stdItem":{ "$ref": "#/definitions/stdItem" }
  }
}

我尝试使用上述方案验证以下json:

{
  "stdItem": {
    "stdType": "CONTAINER",
    "stdAttributes": [
      {
        "attributeName": "ola",
        "attributeValue": "teste"
      }
    ],
    "children": [
      {
        "stdItem": {
          "stdType": "TEXT",
          "stdAttributes": [
            {
              "attributeName": "ola",
              "attributeValue": "teste"
            }
          ],
          "children": []
        }
      }
    ]
  }
}

我收到错误,告诉我路径stdItem / children / 0缺少必需属性 stdType stdAttributes 。正如您所看到的那样,它们并没有丢失。

我试图更改属性的顺序,但仍然无法正常工作。我一直收到以下错误:

  

--- BEGIN MESSAGES ---错误:对象缺少必需的属性([" stdAttributes"," stdType"])       级别:"错误"       schema:{" loadingURI":"#","指针":" / definitions / stdItem"}       实例:{"指针":" / stdItem / children / 0"}       域名:"验证"       关键字:"必需"       必需:[" stdAttributes"," stdType"]       缺少:[" stdAttributes"," stdType"]   ---结束消息---

有人能指出我做错了吗?

1 个答案:

答案 0 :(得分:2)

当你宣布"孩子"你说的财产是一个" stdItem" ,所以它期望有stdAttributes和stdType属性。相反,你在json中拥有的是一个" stdItem"属于stdItem类型的属性。 因此,您缺少架构中该属性(stdItem)的声明。

此架构将验证您的json:

{
  "$schema": "http://json-schema.org/schema#",
  "title": "Layout",
  "description": "The layout created by the user",
  "type": "object",
  "definitions": {
    "stdAttribute": {
      "type": "object",
      "required": ["attributeName","attributeValue"],
      "properties": {
        "attributeValue": {
          "type": "string"
        },
        "attributeName": {
          "type": "string"
        }
      }
    },
    "stdItem": {
      "type": "object",
      "required" : ["stdType","stdAttributes"],
      "properties": {
        "stdType": {
          "enum": [
            "CONTAINER",
            "TEXT",
            "TEXTAREA",
            "BUTTON",
            "LABEL",
            "IMAGE",
            "MARCIMAGE",
            "DATA",
            "SELECT",
            "TABLE"
          ]
        },
        "stdAttributes": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/stdAttribute"
          },
          "minItems": 1
        },
        "children": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "stdItem": { "$ref": "#/definitions/stdItem" }
            }
          }
        }
      }
    }
  },
  "properties":{
    "stdItem": { "$ref": "#/definitions/stdItem" }
  }    
}

请注意,我已将对象添加到" children"的规范中。有一个" stdItem"属性。 (我没有按要求声明它,但你可能想添加它)