Python - 根据架构验证 JSON 文件中的所有行

Python - Validate all rows in JSON file against schema

我正在尝试根据模式验证 JSON 数据文件中的所有行,而不循环遍历 JSON 文件中的每个数据条目。

然而,当只传递整个 JSON 文件时,不会返回任何验证错误。当遍历 JSON 文件中的每一行时,验证按预期工作。

我包括了两个验证,第一个是我想要验证但没有按预期工作的方式。第二次验证有效,但我不想循环。

Python代码:

import json
from jsonschema import validate

data = [
    {
        "Col1":"asd",
        "Col2":"awer",
        "Col3":"xyz"
    },
    {
        "Col1":"asd",
        "Col2":"awer",
        "Col3":123
    }
]

schema = {
    "title": "test",
    "properties":{
                "Col1" : {
                    "minLength": 0,
                    "maxLength": 15,
                    "type": "string"
                },
                "Col2" : {
                    "minLength": 0,
                    "maxLength": 15,
                    "type": "string"
                },
                "Col3" : {
                    "minLength": 0,
                    "maxLength": 15,
                    "type": "string"
                }

    }
}

# Does not return an error
validate(instance=data, schema=schema)

# Works as expected
for i in range(0,2):
    validate(instance=data[i], schema=schema)

您的 JSON 架构未定义数据中预期的 top-level 数组,因此验证器根本不验证任何输入。如果您传递单个对象(数组项),则会验证您定义的属性。

解决方案是将您的模式放在 items 关键字中,作为定义数据数组的 top-level 模式的一部分。

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "JSON schema generated with JSONBuddy https://www.json-buddy.com",
  "title": "",
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "Col1": {
        "minLength": 0,
        "maxLength": 15,
        "type": "string"
      },
      "Col2": {
        "minLength": 0,
        "maxLength": 15,
        "type": "string"
      },
      "Col3": {
        "minLength": 0,
        "maxLength": 15,
        "type": "string"
      }
    }
  }
}