我正在尝试通过以下方式创建json模式:

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


我正在针对它验证以下json:

{
  "layoutItem": {
    "stdItem": {
      "stdType": "CONTAINER",
      "stdAttributes": [],
      "children": []
    }
  }
}


问题是,当我运行Java验证程序时,出现错误,因为我按“ stdItem”的要求指定了“ stdAtrributes”节点,验证程序无法找到它。

我试图在属性中定义所需的数组,但是架构无效。

如果我将“ stdAttributes”放在“ stdItem”之外,则可以。

有谁知道我如何为“ stdItem”定义此要求?

最佳答案

模式中的问题是,您希望layoutItem的值根据#/definitions/stdItem处的模式有效。

但是,此架构未根据您的需要(查看数据)定义具有stdItem属性的对象,而是定义了具有属性stdTypestdAttributeschildren的对象,并且要求属性stdAttributes为当下。换句话说,它是以下数据的架构:

{
  "layoutItem": {
    "stdType": "CONTAINER",
    "stdAttributes": [],
    "children": []
  }
}


对于您的数据,架构应为:

 {
  ...
  "definitions": {
    ...
    "stdItem": {
      "type": "object",
      "required" : ["stdItem"],
      "properties": {
        "stdItem": {
          "type": "object",
          "required" : ["stdAttributes"],
          "properties": {
            "stdType": { ... },
            "stdAttributes": { ... },
            "children": { ... }
          }
        }
      }
    }
  },
  ...
}

10-04 18:41