如何使用JSON模式中的任何定义验证数组中的每个实例

时间:2017-08-29 07:08:45

标签: json validation jsonschema

我需要验证以下数组项。

{
    contents: [{
        type: "text",
        content: "This is text context"
    }, {
        type: "image",
        content: "http://image.url"
    }]
}

我需要验证contents数组中的每个项目。

每个内容对象都应具有typecontent属性。 type可以是" text"," image"或"视频"。 对于图片或视频,content应该是有效的网址。

为此,我编写了以下架构。

{
    "id": "post",
    "description": "generell schema for a post",
    "definitions": {
        "contents": {
            "type": "array",
            "minItems": 1,
            "items": {
                "allOf": [
                    { "$ref": "#/definitions/text" },
                    { "$ref": "#/definitions/image" },
                    { "$ref": "#/definitions/video" },
                    { "$ref": "#/definitions/mention" }
                ]
            }
        },
        "text": {
            "properties": {
                "type": {"enum": ["text"]},
                "content": {"type": "string"}
            },
            "required": [
                "content",
                "type"
            ]
        },
        "image": {
            "properties": {
                "type": {"enum": ["image"]},
                "content": {
                    "type": "string", 
                    "format": "url"
                }
            },
            "required": [
                "content",
                "type"
            ]
        },
        "video": {
            "properties": {
                "type": {"enum": ["video"]},
                "content": {
                    "type": "string", 
                    "format": "url"
                }
            },
            "required": [
                "content",
                "type"
            ]
        }
    }

}

但是JSON以上对我的架构无效。它说data.contents[0].type should be equal to one of the allowed values

如果我使用oneOf而不是allOf它是有效的。但图像内容可以是没有有效URL的字符串。

什么是正确的架构?

1 个答案:

答案 0 :(得分:0)

对于初学者,当您使用allOf时,您正在使用oneOf

根项目还需要属性定义。希望以下更改可帮助您获得所需的解决方案,或指向正确的方向。

{
    "id": "post",
    "description": "generell schema for a post",
    "properties": {
        "contents": {
            "type": "array",
            "minItems": 1,
            "items": {
                "oneOf": [
                    { "$ref": "#/definitions/text" },
                    { "$ref": "#/definitions/image" },
                    { "$ref": "#/definitions/video" },
                    { "$ref": "#/definitions/mention" }
                ]
            }
        }
    }
    "definitions": {
        "text": {
            "properties": {
                "type": {"enum": ["text"]},
                "content": {"type": "string"}
            },
            "required": [
                "content",
                "type"
            ]
        },
        "image": {
            "properties": {
                "type": {"enum": ["image"]},
                "content": {
                    "type": "string", 
                    "format": "url"
                }
            },
            "required": [
                "content",
                "type"
            ]
        },
        "video": {
            "properties": {
                "type": {"enum": ["video"]},
                "content": {
                    "type": "string", 
                    "format": "url"
                }
            },
            "required": [
                "content",
                "type"
            ]
        }
    }

}