Home > OS >  FastApi pydantic: Json object inside a json object validation error
FastApi pydantic: Json object inside a json object validation error

Time:10-01

There is a nested rule of class DocumentSchema in pydantic written in FastApi as follows:

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

and

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

and

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

and

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

and this is the snippets of python code which receives the message from Kafka and process it:

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) 

but for input

{
    "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"
                    }
                }
            ]
        }
    ]
}

It reports the validation error

{"message":"1 validation error for DocumentSchema\ndocumentList -> 0 -> articleList -> 0 -> otherData\n JSON object must be str, bytes or bytearray (type=type_error.json)"}

I should mention that without OtherData everything is Ok.

I don't know how to fix it.

Thanks in advance.

CodePudding user response:

The error occurs because the Json type expects to get a JSON string to deserialize (either as str, bytes or bytearray) to the actual data type.

Since you have already deserialized the string to a dictionary, you could set it as an Optional[Dict] - i.e. either empty or as a list of key: value pairs which should match what you've added as an example.

  • Related