#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
пар, которые должны соответствовать тому, что вы добавили в качестве примера.