Определение схемы JSON с использованием условных операторов - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь определить необязательное условие, используя условное выражение схемы 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"
                        }
                    ]
                }
            ]
        }

    ]
}]

В этом ответе, если объект мозаики содержит ключ errorCode, обязательное поле должно быть errorText и errorCode keys.Like wise если объект плитки не содержит никаких клавиш "errorCode" или "errorText", тогда элемент плитки содержит обязательное поле "dataStamp".

Для проверки вышеуказанного условия я определил схему, подобную приведенной ниже. Но она не работает. Что не так с моей схемой.

 {
    "$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"
        ]
    }
}

1 Ответ

0 голосов
/ 29 августа 2018

Отсутствует оператор if required в properties:

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

Если нет required, значение свойства проверяется, только если свойство установлено. Таким образом, оригинальная if схема будет передавать любой объект без tile_type и errorCode.

https://stackoverflow.com/a/51034071/329463 может вдохновить вас на создание кластеров эксклюзивной недвижимости.

РЕДАКТИРОВАТЬ: измененная полная схема

{
    "$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"
        ]
    }
}
...