Использовать ключи свойств объекта как перечисление в схеме JSON

Я пытаюсь проверить файл JSON с помощью схемы JSON, чтобы найти случаи «неработающих ссылок». По сути, мой файл состоит из элементов и групп, причем каждый элемент принадлежит одной группе, на которую указывает ключ свойства groups, например:

{
    "items": {
        "banana": {
            "name": "Banana",
            "group": "fruits"
        },
        "apple": {
            "name": "Apple",
            "group": "fruits"
        },
        "carrot": {
            "name": "Carrot",
            "group": "vegetables"
        },
        "potato": {
            "name": "Potato",
            "group": "vegetables"
        },
        "cheese": {
            "name": "Cheese",
            "group": "dairy"
        }
    },
    "groups": {
        "fruits": {
            "name": "Fruits"
        },
        "vegetables": {
            "name": "Vegetables"
        }
    }
}

В приведенном выше примере элемент cheese следует считать недопустимым, поскольку в объекте groups нет свойства dairy. Я попытался проверить это, используя следующую схему:

{
    "$schema": "http://json-schema.org/draft-06/schema#",
    "title": "Food",
    "id": "food",
    "type": "object",
    "properties": {
        "items": {
            "type": "object",
            "patternProperties": {
                "^[A-Za-z0-9-_.:=]+$": {
                    "properties": {
                        "name": {
                            "type": "string",
                            "pattern": "^[A-Za-z- ]+$"
                        },
                        "group": {
                            "pattern": "^[a-z]+$",
                            "enum": {
                                "$data": "/groups"
                            }
                        }
                    }
                }
            }
        },
        "groups": {
            "type": "object",
            "patternProperties": {
                "^[A-Za-z0-9-_]+$": {
                    "properties": {
                        "name": {
                            "type": "string",
                            "pattern": "^[A-Za-z- ]+$"
                        }
                    }
                }
            }
        }
    },
    "additionalProperties": false
}

Это приводит к тому, что enum для group заполняется значениями свойств в groups, но я хочу использовать свойство keys, определенное в groups.

Если я добавлю свойство, например, groupIds и пусть это будет массив всех ключей свойств, найденных в groups, и укажите перечисление как "$data": "/groupIds", он действительно работает, поэтому я считаю, что это проблема указателя JSON.

Ключевое слово enum в схеме JSON определяется как:

Значение этого ключевого слова ДОЛЖНО быть массивом. Этот массив ДОЛЖЕН иметь хотя бы один элемент. Элементы в массиве ДОЛЖНЫ быть уникальными.

Итак, если бы я мог получить только указатель JSON для ссылки на ключи объекта, а не на его значения, я думаю, проверка перечисления просто сработала бы. Я думаю что-то вроде "$data": "/groups/.keys", "$data": "/groups/$keys" или что-то подобное, но не нашел, пока гуглил или читал спецификацию. Есть ли такая вещь или она когда-либо предлагалась?


person Simon    schedule 23.11.2017    source источник


Ответы (1)


Нет такого. Он очень близок к общим выражениям внутри JSON и может иметь некоторые варианты использования, но такой спецификации нет.

person esp    schedule 23.11.2017
comment
это все еще верно? Я задал аналогичный вопрос на stackoverflow.com/questions/57556768/. - person user3146897; 19.08.2019