数组未在JSON模式中验证

时间:2018-03-23 13:40:40

标签: arrays json jsonschema

我有一个没有进行适当验证的架构定义。基本上,它不会检查数组中的任何内容并接受其中的任何属性/值。我是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视为对模式有效。我一直在挠头几个小时,有没有人知道?

2 个答案:

答案 0 :(得分:1)

出现这种情况有几个原因,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
                }
            }
        }
    }
}

答案 1 :(得分:0)

找到解决方案。似乎我不仅要将数组属性设置为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
}