json 使用条件语句的模式定义

json schema definition using conditional statements

我正在尝试使用 json 架构条件语句(使用草案 7)定义可选条件

我有一个 json 这样的回复。

[{
    "views": [{
            "name": "RSO Roster",
            "displayOrder": 5,
            "groups": [{
                    "type": "scrollable",
                    "displayOrder": 1,
                    "auditType": "player-pregame_roster",
                    "tiles": [{
                            "context": "event",
                            "dataStamp": 1535184247,
                            "tile_type": "person"
                        }, {
                            "context": "event",
                            "errorCode": 2, 
                            "errorText": "seloger",                                 
                            "tile_type": "person"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Leaders",
            "displayOrder": 1,
            "groups": [{
                    "type": "static",
                    "displayOrder": 1,                      
                    "tiles": [{
                            "context": "event",
                            "dataStamp": 1535184247,
                            "eventId":123
                            "tile_type": "static"
                        }
                    ]
                }
            ]
        }

    ]
}]

在此响应中,如果 tile 对象包含键 errorCode,则必填字段必须 errorTexterrorCode keys.Like 明智 如果磁贴对象不包含任何“errorCode”或“errorText”键,则磁贴项目包含必填字段“dataStamp”。

为了验证上述条件,我定义了一个类似于 below.But 的模式,它 working.Whats 我的模式没有错。

 {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "array",
    "items": {
        "type": "object",
        "properties": {
            "views": {
                "$id": "views",
                "type": "array",
                "items": {
                    "$id": "views/items",
                    "type": "object",
                    "properties": {
                        "groups": {
                            "$id": "views/groups",
                            "type": "array",
                            "items": {
                                "$id": "views/groups/items",
                                "type": "object",
                                "properties": {
                                    "tiles": {
                                        "$id": "views/groups/tiles",
                                        "type": "array",
                                        "items": {
                                            "$id": "views/groups/tiles/items",
                                            "type": "object",
                                            "properties": {
                                                "dataStamp": {
                                                    "$id": "views/groups/tiles/dataStamp",
                                                    "type": "integer"
                                                },
                                                "tile_type": {
                                                    "$id": "views/groups/tiles/tile_type",
                                                    "type": "string"
                                                },
                                                "errorCode": {
                                                    "type": "integer",
                                                    "enum": [
                                                        2, 10
                                                    ]
                                                },
                                                "errorText": {
                                                    "type": "string",
                                                    "enum": [
                                                        "seloger", "france24"
                                                    ]
                                                }
                                            },
                                            "if": {
                                                "properties": {
                                                    "tile_type": {
                                                        "enum": ["person"]
                                                    },
                                                    "errorCode": {
                                                        "enum": [2, 10]
                                                    }

                                                },
                                                "required": ["errorCode", "errorText"]
                                            }

                                        }
                                    }
                                },
                                "required": [
                                    "type",
                                    "tiles"
                                ]
                            }
                        }
                    },
                    "required": [
                        "groups"
                    ]
                }
            }
        },
        "required": [
            "views"
        ]
    }
}

if 语句在 properties 中丢失 required:

                                        "if": {
                                            "properties": {
                                                "tile_type": {
                                                    "enum": ["person"]
                                                },
                                                "errorCode": {
                                                    "enum": [2, 10]
                                                },
                                                "required": ["errorCode"]
                                            }
                                        },

如果没有 required,则 属性 的值仅在设置 属性 时有效。所以原始 if 模式将传递任何没有 tile_typeerrorCode.

的对象

可能会给您一些构建专属物业集群的灵感。

编辑:修改完整架构

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "array",
    "items": {
        "type": "object",
        "properties": {
            "views": {
                "$id": "views",
                "type": "array",
                "items": {
                    "$id": "views/items",
                    "type": "object",
                    "properties": {
                        "groups": {
                            "$id": "views/groups",
                            "type": "array",
                            "items": {
                                "$id": "views/groups/items",
                                "type": "object",
                                "properties": {
                                    "tiles": {
                                        "$id": "views/groups/tiles",
                                        "type": "array",
                                        "items": {
                                            "$id": "views/groups/tiles/items",
                                            "type": "object",
                                            "properties": {                                                                                                                                             
                                                "dataStamp": {
                                                    "$id": "views/groups/tiles/dataStamp",
                                                    "type": "integer"
                                                },                                              
                                                "tile_type": {
                                                    "$id": "views/groups/tiles/tile_type",
                                                    "type": "string"
                                                },
                                                "errorCode": {
                                                    "type": "integer",
                                                    "enum": [
                                                        2, 10
                                                    ]
                                                },
                                                "errorText": {
                                                    "type": "string",
                                                    "enum": [
                                                        "seloger", "france24"
                                                    ]
                                                }
                                            },
                                            "if": {
                                                "properties": {
                                                    "tile_type": {
                                                        "enum": ["person"]
                                                    },
                                                    "errorCode": {
                                                        "enum": [2, 10]
                                                    }

                                                },
                                                "required":["errorCode"]
                                            },
                                            "then": {
                                                "required": ["errorCode", "errorText"]
                                            },
                                            "else": {
                                                "required": ["dataStamp"]
                                            }

                                        }
                                    }
                                },
                                "required": [
                                    "type",
                                    "tiles"
                                ]
                            }
                        }
                    },
                    "required": [
                        "groups"
                    ]
                }
            }
        },
        "required": [
            "views"
        ]
    }
}