带引用的JSON模式:为什么找不到必填字段?

时间:2014-01-06 15:34:36

标签: json jsonschema

我使用JSON模式,该模式应定义具有任意数量按钮的屏幕:

{
    "$schema": "http://json-schema.org/draft-03/schema",
    "type": "object",
    "properties": {
        "Screen": {
            "type": "object",
            "properties": {
                "Widgets": {
                    "type": "array",
                    "required": true,
                    "items": {
                        "$ref": "#/properties/Button"
                    }
                }
            }
        },
        "Button": {
            "type": "object",
            "properties": {
                "title": {
                    "required": true,
                    "type": "string"
                }
            }
        }
    }
}

这是我验证的JSON:

{
    "Screen": {
        "Widgets": [
            {
                "Button": {
                    "title": "10"
                }
            }
        ]
    }
}

我使用http://json-schema-validator.herokuapp.com/作为验证器,在这里我收到以下错误:

[ {
  "level" : "error",
  "schema" : {
    "loadingURI" : "#",
    "pointer" : "/properties/Button"
  },
  "instance" : {
    "pointer" : "/Screen/Widgets/0"
  },
  "domain" : "validation",
  "keyword" : "properties",
  "message" : "missing required property(ies)",
  "required" : [ "title" ],
  "missing" : [ "title" ]
} ]

必填字段title报告为缺失,但它位于JSON中。 我假设我在引用Button时出了问题,但我无法弄清楚如何解决这个问题。

2 个答案:

答案 0 :(得分:1)

因为根据您的架构,Widgets数组中的每个元素必须符合#/ properties / Button中定义的架构。 此模式表明每个Button必须是一个Json对象,其中包含一个名为“title”的必需属性。在代码中:

{"title": "10"}

但是你提供了一个名为“Button”的属性的Json对象,这不是你指定的限制。

注意你正在使用Json-schema draft03,你应该看看draft04,虽然这种情况没有区别。

答案 1 :(得分:0)

给定架构的有效JSON是: `

{
  "Screen": {
    "Widgets": [
      {
        "title": "10"
      }
    ]
  }
}

`