簡體   English   中英

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

[英]Check if JSON string is valid Pydantic schema

我想檢查 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))

Output:

True
False

使用 try/except 來獲得真/假似乎是不好的做法。 有沒有更好的辦法?

我認為這是一個很好的方法,我只建議將 JSON 解析與 model 實例化分開處理,並且在捕獲異常時更具體,見下文:

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 model。

import pydantic

class MySchema(pydantic.BaseModel):
    val: int

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

我認為這將是最簡單的解決方案:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM