FastApi pydantic: объект Json внутри ошибки проверки объекта json

#python #json #fastapi #pydantic

Вопрос:

В pydantic существует вложенное правило класса DocumentSchema , написанное в FastApi следующим образом:

 class DocumentSchema(BaseModel):
    clientName: str
    transactionId: str
    documentList: List[SingleDocumentSchema]
 

и

 class SingleDocumentSchema(BaseModel):
    documentInfo: DocumentInfoSchema
    articleList: List[DocumentArticleSchema]
 

и

 class DocumentInfoSchema(BaseModel):
    title: str
    type: str
    referenceId: int
    batchNoList: Optional[List]
    otherData: Optional[Json]
 

и

 class DocumentArticleSchema(BaseModel):
    type: str
    value: int
    accountType: Optional[AccountTypeEnums]
    accountId: Optional[int]
    otherData: Optional[Json]
 

и это фрагменты кода python, который получает сообщение от Кафки и обрабатывает его:

 def process(self) -> bool:
    try:
        DocumentSchema(
            **json.loads(self._message)
        )
        return self._process()

    except ValidationError as e:
        raise UnprocessableEntityException(e, self._topic)
    except ValueError as e:
        raise UnprocessableEntityException(e, self._topic)
    except Exception as e:
        raise UnprocessableEntityException(e, self._topic) 
 

но для ввода

 {
    "clientName": "amazon",
    "transactionId": "e3e60ca3-7eb1-4a55-ae35-c43f9b2ea3fd",
    "documentList": [
        {
            "documentInfo": {
                "title": "New Order",
                "type": "order",
                "referenceId": 19488682
            },
            "articleList": [
                {
                    "type": "product_price",
                    "value": 1350,
                    "otherData": {
                        "weight": "4 kg"
                    }
                }
            ]
        }
    ]
}
 

Он сообщает об ошибке проверки

{«сообщение»:»1 ошибка проверки для DocumentSchemandocumentList -> 0 ->> Список статей ->>> 0 ->>>> Объект otherDatan JSON должен быть str, байт или bytearray (тип=type_error.json)»}

Я должен упомянуть, что без OtherData этого все в порядке.

Я не знаю, как это исправить.

Заранее спасибо.

Ответ №1:

Ошибка возникает из Json -за того , что тип ожидает получить строку JSON для десериализации (либо как str , bytes либо bytearray ) в фактический тип данных.

Поскольку вы уже десериализовали строку в словарь, вы можете установить ее как Optional[Dict] — т. е. либо пустую, либо в виде списка key: value пар, которые должны соответствовать тому, что вы добавили в качестве примера.