【问题标题】:Python Marshmallow json validation with nested object array带有嵌套对象数组的 Python Marshmallow json 验证
【发布时间】:2021-11-24 11:02:27
【问题描述】:

Python Flask API 和 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 有效负载(例如由 Postman 发送): RequestObject().validate(request.get_json())

我正在其他没有数组的简单 API 上执行此验证方法,但在这里,Marshmallow 给了我错误

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

不知道我做错了什么......

如果有人有解释:)

亲切的问候

【问题讨论】:

    标签: python json marshmallow


    【解决方案1】:

    我们使用 Python Flask API 和 webargs.flaskparser 进行验证(它使用棉花糖字段),所以您的问题可能与我们遇到的原因相同。我们有一些参数是字典数组,比如

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

    我们已将验证设置为

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

    并不断收到验证错误。我们发现这是因为作为将请求发送到 Python API 的 json 编码的一部分,字典被编码为字符串。所以真正的论点是

    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 的情况下自行执行验证。也许类似的东西会对你的情况有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      • 1970-01-01
      • 2019-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多