如何使用 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)
我有这个简单的代码,它使用棉花糖将复杂对象转换为其 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)