JSON Schema中如何执行数组验证?

时间:2017-04-06 18:58:51

标签: json jsonschema

我有以下JSON架构代码段。

dynamic

我想允许所有文档,这些文档在“attributes”数组中至少有3个元素。它们的值必须是“a”,“b”和“c”,但最重要的是我不想拒绝可能扩展该列表的文档。 例如,我希望以下代码段有效:

  "attributes": {
                "type": "array",
                "minItems": 3,
                "items": {
                    "type": "string",
                    "enum": [
                        "a",
                        "b",
                        "c"
                    ]
                }
            }

目前我的验证失败,因为数组中还有其他值。

请告知。

2 个答案:

答案 0 :(得分:1)

使用draft-06,您可以使用关键字contains

{
  "type": "array",
  "minItems": 3,
  "allOf": [
    { "contains": { "const": "a" } },
    { "contains": { "const": "b" } },
    { "contains": { "const": "c" } }
  ]
}

使用draft-04,你需要使用:

{
  "type": "array",
  "minItems": 3,
  "allOf": [
    { "not": { "items": { "not": { "enum": ["a"] } } } },
    { "not": { "items": { "not": { "enum": ["b"] } } } },
    { "not": { "items": { "not": { "enum": ["c"] } } } }
  ]
}

答案 1 :(得分:0)

我找到了解决问题的方法:

"attributes": {
            "type": "array",
            "uniqueItems": true,
            "minItems": 3,
            "items": [
                {"type": "string", "enum": ["a"]},
                {"type": "string", "enum": ["b"]},
                {"type": "string", "enum": ["c"]}
            ]
        }

但我不喜欢这种方法是我必须按照它们在模式中的顺序指定所需的元素。 例如:"attributes": ["a", "b", "c", "z", "x"]可以正常工作。但如果我弄乱了所需属性的顺序,验证就会失败。 "attributes": ["b", "a", "c", "z", "x"] - 架构无效。 修好后也会很好。