【问题标题】:Can you validate json per object?您可以验证每个对象的 json 吗?
【发布时间】:2021-09-10 14:12:49
【问题描述】:

我想根据定义的 jsonschema 验证我的 json 数据。 我有以下脚本:

import json
import jsonschema
from jsonschema import validate

schema = {
  "type": "array",
  "items": {
    "properties": {
      "description": {
        "type": "string"
      },
      "status": {
        "type": "boolean"
      },
      "value1": {
        "type": "number"
      },
      "value2": {
        "type": "number"
      }
    }
  }
}

data = json.loads('[{"description": "Hello world!", "status": true, "value1": 1, "value2": 2}, {"description": "Test", "status": "true", "value1": 3, "value2": 4}]')

def validateJson(data):
    try:
        validate(instance=data, schema=schema)
    except jsonschema.exceptions.ValidationError as err:
        print(err)
        return False
    return True

# validate it
isValid = validateJson(data)
if isValid:
    print(data)
    print("Given JSON data is Valid")
else:
    print(data)
    print("Given JSON data is InValid")

当我运行代码时,我发现数据无效,因为第二个对象中的“true”不是布尔值。但是如你所见,第一个对象

{"description": "Hello world!", "status": true, "value1": 1, "value2": 2}

有效。所以我真正想要的是 validateJSON 函数给了我有效和无效的对象,而不是作为一个整体来验证数据。我该怎么做?

【问题讨论】:

  • 也许加载 JSON 数组并仅为特定项目定义架构,然后遍历数组的项目并验证每个项目?
  • @TDk 我没想到,谢谢!我会试试这个。

标签: python json jsonschema


【解决方案1】:

定义一个架构,您的 array 中的每个 JSON object 都应针对其进行验证,并独立验证每个架构。

schema = {
  "type": "object",
  "properties": {
    "description": {
      "type": "string"
    },
    "status": {
      "type": "boolean"
    },
    "value1": {
      "type": "number"
    },
    "value2": {
      "type": "number"
    }
  }
}

然后:

>>> for i, obj in enumerate(data):
...     try:
...         validate(instance=obj, schema=schema)
...     except Exception as e:
...         print(f"obj {i} invalid: {e}")
...     else:
...         print(f"obj {i} valid")

obj 0 valid
obj 1 invalid: 'true' is not of type 'boolean'

Failed validating 'type' in schema['properties']['status']:
    {'type': 'boolean'}

On instance['status']:
    'true'

如果要保留对有效对象和无效对象的引用,可以将它们的数字索引附加到两个列表中,例如 valid_idxs: list[int]invalid_idxs: list[int]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    相关资源
    最近更新 更多