【问题标题】:Python Using Marshmallow To Load a JSON Object into a collection of Python ClassPython 使用 Marshmallow 将 JSON 对象加载到 Python 类的集合中
【发布时间】:2020-12-03 10:16:49
【问题描述】:

我正在尝试使用 Marshmallow 模块将 JSON 对象(存储在 .JSON 文件中)加载到 Python 类的集合中。我已经创建了我的班级和班级架构。但是,当我尝试使用 Schema 加载数据时,出现以下错误:

{0: {'GroupId': ['Unknown field.'],
     'Id': ['Unknown field.'],
     'Name': ['Unknown field.']},
 1: {'GroupId': ['Unknown field.'],
     'Id': ['Unknown field.'],
     'Name': ['Unknown field.']},
 2: {'GroupId': ['Unknown field.'],
     'Id': ['Unknown field.'],
     'Name': ['Unknown field.']},
 3: {'GroupId': ['Unknown field.'],
     'Id': ['Unknown field.'],
     'Name': ['Unknown field.']},
 4: {'GroupId': ['Unknown field.'],
     'Id': ['Unknown field.'],
     'Name': ['Unknown field.']},
 5: {'GroupId': ['Unknown field.'],
     'Id': ['Unknown field.'],
     'Name': ['Unknown field.']},
 6: {'GroupId': ['Unknown field.'],
     'Id': ['Unknown field.'],
     'Name': ['Unknown field.']},
 7: {'GroupId': ['Unknown field.'],
     'Id': ['Unknown field.'],
     'Name': ['Unknown field.']},
 8: {'GroupId': ['Unknown field.'],
     'Id': ['Unknown field.'],
     'Name': ['Unknown field.']},
 9: {'GroupId': ['Unknown field.'],
     'Id': ['Unknown field.'],
     'Name': ['Unknown field.']},
 10: {'GroupId': ['Unknown field.'],
      'Id': ['Unknown field.'],
      'Name': ['Unknown field.']},
 11: {'GroupId': ['Unknown field.'],
      'Id': ['Unknown field.'],
      'Name': ['Unknown field.']},
 12: {'GroupId': ['Unknown field.'],
      'Id': ['Unknown field.'],
      'Name': ['Unknown field.']},
 13: {'GroupId': ['Unknown field.'],
      'Id': ['Unknown field.'],
      'Name': ['Unknown field.']},
 14: {'GroupId': ['Unknown field.'],
      'Id': ['Unknown field.'],
      'Name': ['Unknown field.']},
 15: {'GroupId': ['Unknown field.'],
      'Id': ['Unknown field.'],
      'Name': ['Unknown field.']},
 16: {'GroupId': ['Unknown field.'],
      'Id': ['Unknown field.'],
      'Name': ['Unknown field.']},
 17: {'GroupId': ['Unknown field.'],
      'Id': ['Unknown field.'],
      'Name': ['Unknown field.']},
 18: {'GroupId': ['Unknown field.'],
      'Id': ['Unknown field.'],
      'Name': ['Unknown field.']},
 19: {'GroupId': ['Unknown field.'],
      'Id': ['Unknown field.'],
      'Name': ['Unknown field.']}}

为了简化问题的答案,我将解决方案打包到以下文件中:

stackoverflow.py:

    from marshmallow import Schema, fields, post_load, ValidationError
    import json
    from pprint import pprint
    
    
    class Person:
        def __init__(self, id, name, groupId):
            self.id = id
            self.name = name
            self.groupId = groupId
    
        def __repr__(self):
            return f"{self.id}, {self.name}, {self.groupId}"
    
    
    class PersonSchema(Schema):
        id = fields.Integer()
        name = fields.String()
        groupId = fields.Integer()
    
        @post_load
        def create_person(self, data, **kwargs):
            return Person(**data)
    
    
    with open("data.json") as json_file:
     
        data = json.load(json_file)
        try:
            PersonSchema(many=True).load(data)
        except ValidationError as err:
            pprint(err.messages)

data.json:

    [
  {
    "Id": 1,
    "Name": "Alex",
    "GroupId": 1
  },
  {
    "Id": 2,
    "Name": "Bob",
    "GroupId": 1
  },
  {
    "Id": 3,
    "Name": "Charlie",
    "GroupId": 1
  },
  {
    "Id": 4,
    "Name": "Daniel",
    "GroupId": 2
  },
  {
    "Id": 5,
    "Name": "Emma",
    "GroupId": 2
  },
  {
    "Id": 6,
    "Name": "Fran",
    "GroupId": 3
  },
  {
    "Id": 7,
    "Name": "George",
    "GroupId": 3
  },
  {
    "Id": 8,
    "Name": "Harry",
    "GroupId": 2
  },
  {
    "Id": 9,
    "Name": "Ian",
    "GroupId": 2
  },
  {
    "Id": 11,
    "Name": "James",
    "GroupId": 2
  },
  {
    "Id": 12,
    "Name": "Kevin",
    "GroupId": 2
  },
  {
    "Id": 13,
    "Name": "Louis",
    "GroupId": 1
  },
  {
    "Id": 14,
    "Name": "Martin",
    "GroupId": 1
  },
  {
    "Id": 15,
    "Name": "Norman",
    "GroupId": 1
  },
  {
    "Id": 16,
    "Name": "Oscar",
    "GroupId": 1
  },
  {
    "Id": 17,
    "Name": "Paul",
    "GroupId": 1
  },
  {
    "Id": 18,
    "Name": "Quintin",
    "GroupId": 1
  },
  {
    "Id": 19,
    "Name": "Roger",
    "GroupId": 2
  },
  {
    "Id": 20,
    "Name": "Steve",
    "GroupId": 2
  },
  {
    "Id": 21,
    "Name": "Terry",
    "GroupId": 2
  }
]

【问题讨论】:

    标签: python json deserialization marshmallow


    【解决方案1】:

    我这一行:

    PersonSchema(many=True).loads(data)
    

    data 是一个 python 对象,而不是一个字符串。我想你必须使用load 而不是loads

    【讨论】:

    • 谢谢@albar 这让我更进一步。我得到的错误现在已经改变(并反映在问题中)。
    • 我回答了你的问题。现在你在问一个新问题。
    猜你喜欢
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    相关资源
    最近更新 更多