Массивы не проверяются в схеме JSON

У меня есть определение схемы, которое не выполняет надлежащую проверку. По сути, он ничего не проверяет внутри массива и принимает в нем какие-либо свойства / значения. Я новичок в проверке JSON, поэтому, возможно, мне что-то не хватает.

Это схема:

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "http://json-schema.org/draft-07/schema#",
    "title": "JSON Validator",
    "type": "object",
    "additionalProperties": {
        "type": "array",
        "items": {
            "type": "object",
            "properties": {
                "hash": {
                    "type": "string"
                },
                "date": {
                    "type": "string"
                },
                "uuid": {
                    "type": "string"
                },
                "task": {
                    "type": "object",
                    "properties": {
                        "name": {
                            "type": "string"
                        },
                        "order": {
                            "type": "integer"
                        },
                        "step": {
                            "type": "integer"
                        }
                    }
                },
                "meta": {
                    "type": "string"
                },
                "additionalProperties": false,
            }
        },
        "required": [
          "hash"
        ]
    }
}

Тестовый JSON будет таким:

{
  "task_N": [
    {
      "uuid": "asdfsdafa",
      "author": {
        "id": 1,
        "email": "asdfasdd",
        "name": "dfasd"
      },
      "ip": "245245",
      "message": "asdfasd",
      "step": "",
      "is_archived": false,
      "creation_date": "34332423",
      "related_field": ""
    },
    {
      "uuid": "asdfsdafa",
      "author": {
        "id": 1,
        "email": "asdfasdd",
        "name": "dfasd"
      },
      "ip": "245245",
      "message": "asdfasd",
      "step": "",
      "is_archived": false,
      "creation_date": "34332423",
      "related_field": ""
    }
  ]
}

Как видите, в свойствах массива нет единого совпадения, но и библиотека Python jsonschema, и http://jsonschemavalidator.net предоставляют JSON как действительный для схемы. Я чешу затылок несколько часов, кто-нибудь знает?

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
0
780
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это происходит по нескольким причинам: схема JSON требует, чтобы весь ваш пример соответствовал схеме, поэтому вам нужно будет иметь "task_N" как часть схемы.

Кроме того, ваша схема определена в additionalProperties, она должна быть properties.

Попробуй это:

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "http://json-schema.org/draft-07/schema#",
    "title": "JSON Validator",
    "type": "object",
    "properties": {
        "task_N": {
            "type": "array",
            "items": {
                "type": "object",
                "required": [
                    "hash"
                ],
                "properties": {
                    "hash": {
                        "type": "string"
                    },
                    "date": {
                        "type": "string"
                    },
                    "uuid": {
                        "type": "string"
                    },
                    "task": {
                        "type": "object",
                        "properties": {
                            "name": {
                                "type": "string"
                            },
                            "order": {
                                "type": "integer"
                            },
                            "step": {
                                "type": "integer"
                            }
                        }
                    },
                    "meta": {
                        "type": "string"
                    },
                    "additionalProperties": false
                }
            }
        }
    }
}

Дело в том, что «task_N» - это свойство имени переменной. Нет определенного количества свойств, и название будет другим. Будет ли работать с недвижимостью?

Oscar Carballal 26.03.2018 08:17
Ответ принят как подходящий

Нашел решение. Кажется, мне нужно установить не только свойства массива в false, но и родительский. Кроме того, мне нужно было настроить его как «patternProperties» с правильным регулярным выражением. Готовая схема такова:

 {
    '$schema': 'http://json-schema.org/draft-07/schema#',
    '$id': 'http://json-schema.org/draft-07/schema#',
    'type': 'object',
    'patternProperties': {
        '^[a-zA-Z0-9]*$': {
            'type': 'array',
            'items': {
                'type': 'object',
                'required': [
                    'hash',
                    'date',
                    'uuid',
                    'task',
                    'author'
                ],
                'properties': {
                    'hash': {
                        'type': 'string'
                    },
                    'date': {
                        'type': 'string'
                    },
                    'uuid': {
                        'type': 'string'
                    },
                    'task': {
                        'type': 'object',
                        'properties': {
                            'name': {
                                'type': 'string'
                            },
                            'order': {
                                'type': 'integer'
                            },
                            'step': {
                                'type': 'integer'
                            }
                        }
                    },
                    'author': {
                        'type': 'object',
                        'properties': {
                            'id': {
                                'type': 'integer'
                            },
                            'name': {
                                'type': 'string'
                            },
                            'email': {
                                'type': 'string'
                            }
                        }
                    },
                    'meta': {
                        'type': 'string'
                    }
                },
                'additionalProperties': false
            }
        }
    },
    'additionalProperties': false
}

Другие вопросы по теме