检查JSON字符串是否是有效的Pydantic模式

3
我想检查一个JSON字符串是否是有效的Pydantic模式。
from pydantic import BaseModel

class MySchema(BaseModel):
    val: int

我可以使用try/except非常简单地实现这个:

import json

valid = '{"val": 1}'
invalid = '{"val": "horse"}'

def check_valid(item):
    try:
        MySchema(**json.loads(item))
        return True
    except:
        return False

print(check_valid(valid))
print(check_valid(invalid))

输出:

True
False

使用try/except来获得true/false似乎是不好的实践。有更好的方法吗?


最好捕获特定的异常。在这种情况下,是来自pydantic的ValidationError和来自json.loads的exception。 - Artur Shiriev
1
顺便提一下,pydantic 默认具有一些类型转换功能,所以请注意。因此,pydantic 不仅是验证器,还是格式化程序。 - Artur Shiriev
3个回答

7
import pydantic

class MySchema(pydantic.BaseModel):
    val: int

MySchema.parse_raw('{"val": 1}')
MySchema.parse_raw('{"val": "horse"}')

我认为这将是最简单的解决方案 :)


0

我认为这是一个不错的方法,我只建议将JSON解析与模型实例化分开处理,并在捕获异常时更具体,如下所示:

import pydantic
import json

class MySchema(pydantic.BaseModel):
    val: int

invalid_json = '{"invalid": 123'
invalid_value = '{"val": "horse"}'
invalid_key = '{"wrong_key": 1}'

valid = '{"val": 1}'
valid_2 = '{"val": "1"}'

def check_valid(item):
    try:
        json_item = json.loads(item)

    # Catch potential JSON formatting problems:
    except json.JSONDecodeError as exc:
        print(f"ERROR: Invalid JSON: {exc.msg}, line {exc.lineno}, column {exc.colno}")
        return False

    try:
        MySchema(**json_item)

    # Catch pydantic's validation errors:
    except pydantic.ValidationError as exc:
        print(f"ERROR: Invalid schema: {exc}")
        return False

    return True

print(check_valid(invalid_json))
# ERROR: Invalid JSON: Expecting ',' delimiter, line 1, column 16
# False

print(check_valid(invalid_value))
# ERROR: Invalid schema: 1 validation error for MySchema
# val
#   value is not a valid integer (type=type_error.integer)
# False

print(check_valid(invalid_key))
# ERROR: Invalid schema: 1 validation error for MySchema
# val
#   field required (type=value_error.missing)
# False

print(check_valid(valid))
# True

print(check_valid(valid_2))
# True

当然,你可以将逻辑分成两个函数,一个处理JSON验证,另一个处理pydantic模型。

0

parse_raw自2.0版本起已被弃用。相反,您可以使用Model.model_validate_json方法:

import pydantic

class MySchema(pydantic.BaseModel):
    val: int


# returns a validated instance
MySchema.model_validate_json('{"val": 1}')

# raises pydantic.ValidationError
MySchema.model_validate_json('{"val": "horse"}')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接