Проверка Python Marshmallow json с помощью вложенного массива объектов

#python #json #marshmallow

Вопрос:

Новый пользователь для API Python Flask и проверки схемы Marshmallow. Короткий вопрос здесь, может быть, я сам неправильно понял.

Получил объект (класс) Python, который содержит переменные и другие объекты в массиве, например :

 class NestedObj2(Schema):  field_a = fields.String(required=True, validate=validate.Length(max=4))    class Meta:  fields = (['field_a'])  class NestedObj1(Schema):  field_b = fields.String(required=True, validate=validate.Length(max=10))  field_c = fields.Integer(required=True)  field_d = fields.Nested(NestedObj2(), required=True, many=True)   class Meta:  fields = ('field_b', 'field_c', 'field_d')  class RequestObject(Schema):  field_d = fields.String(required=True, validate=validate.Length(max=10)  field_e = fields.Number(required=True)  field_f = fields.Boolean(required=True)  field_g = fields.Nested(NestedObj1(), required=True, many=True)    class Meta:  fields = ('field_d', 'field_e', 'field_f', 'field_g')  

И я хочу проверить полезную нагрузку JSON (например, отправленную почтальоном) с помощью команды : RequestObject().validate(request.get_json())

Я выполняю этот метод проверки на других простых API без массива, но здесь зефир вызывает у меня ошибку

 {  "field_g": {  "_schema": [  "Invalid input type."  ]  } }  

Полезная нагрузка для проверки :

 {  "field_d": "my_string",  "field_e": "100.0",  "field_f": True,  "field_g": [  {  "field_b": "2nd_str",  "field_c": "200.0",  "field_d": [  {  "field_a": "3rds"  }  ]  }  ] }  

Не знаю, что я делаю не так…

Если у кого-нибудь есть объяснение 🙂

С уважением

Ответ №1:

Мы используем API Python Flask с webargs.flaskparser для проверки (который использует поля зефира), поэтому, возможно, ваша проблема связана с той же причиной, что и у нас. У нас было несколько аргументов, которые представляли собой массивы словарей, таких как

 speakers = [  {'name': 'some name', 'info': 'some info'},   {'name': 'name2', 'info': 'info2'} ]  

Мы настроили проверку следующим образом

 fields.List(fields.Dict(), required=False)  

и продолжал получать ошибку проверки. Мы выяснили, что это произошло потому, что в рамках кодирования json, которое было сделано для отправки запроса в наш API Python, словари кодировались в виде строк. Так что на самом деле аргументы были

 speakers = [  "{'name': 'some name', 'info': 'some info'}",   "{'name': 'name2', 'info': 'info2'}"  ]  

В итоге мы изменили проверку на

 fields.List(fields.Str(), required=False)  

получение структуры словаря с помощью json.loads:

 import json speakers = json.loads(args['speakers'])  

а затем выполнить проверку самостоятельно без webargs/marshmallow. Может быть, что-то подобное поможет в вашем случае.