如何使用 marshmallow 将复杂对象导出为有效 json (带双引号)?

How can I use marshmallow to export a complex object to valid json (with double quotes)?

我有这个简单的代码,它使用棉花糖将复杂对象转换为其 json 表示形式:

from marshmallow import Schema, fields
import json


class Purchase:
    def __init__(self):
        self.date = ""
        self.item = ""
        self.price = ""
        self.description = ""


class User:
    def __init__(self):
        self.first_name = ""
        self.last_name = ""
        self.username = ""
        self.password = ""
        self.credit_card = ""
        self.purchase_history = list()


class PurchaseSchema(Schema):
    date = fields.Str()
    item = fields.Str()
    price = fields.Str()
    description = fields.Str()


class UsersSchema(Schema):
    first_name = fields.Str()
    last_name = fields.Str()
    username = fields.Str()
    password = fields.Str()
    credit_card = fields.Str()
    purchase_history = fields.List(fields.Nested(PurchaseSchema))


user = User()
for i in range(10):
    p = Purchase()
    if i % 2 == 0:
        p.item = "item \"" + str(i) + "\""
    else:
        p.item = "item \'" + str(i) + "\'"
    user.purchase_history.append(p)

schema = UsersSchema()
output = str(schema.dump(user))
print(output)

不幸的是,输出并不完全有效,因为一些字符串以单引号而不是双引号开头和结尾。

{
    'purchase_history': [{
        'price': '',
        'item': 'item "0"',
        'description': '',
        'date': ''
    }, {
        'price': '',
        'item': "item '1'",
        'description': '',
        'date': ''
    }, {
        'price': '',
        'item': 'item "2"',
        'description': '',
        'date': ''
    }, {
        'price': '',
        'item': "item '3'",
        'description': '',
        'date': ''
    }, {
        'price': '',
        'item': 'item "4"',
        'description': '',
        'date': ''
    }, {
        'price': '',
        'item': "item '5'",
        'description': '',
        'date': ''
    }, {
        'price': '',
        'item': 'item "6"',
        'description': '',
        'date': ''
    }, {
        'price': '',
        'item': "item '7'",
        'description': '',
        'date': ''
    }, {
        'price': '',
        'item': 'item "8"',
        'description': '',
        'date': ''
    }, {
        'price': '',
        'item': "item '9'",
        'description': '',
        'date': ''
    }],
    'first_name': '',
    'last_name': '',
    'credit_card': '',
    'password': '',
    'username': ''
}

因此,如果我将 parsed = json.load(output) 添加到脚本末尾,我会收到错误消息:

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

如何使用 marshmallow 将模式导出为 valid JSON? (带双引号)

schema.dump returns 一个 dict,所以 str 给你类似 Python 文字的东西。

你可以用 json.dumps:

编码字典
schema = UsersSchema()
output = schema.dump(user)
print(json.dumps(output))

或使用schema.dumps直接进入JSON。

schema = UsersSchema()
output = schema.dumps(user)
print(output)