如何使用棉花糖中无效的 Python 名称反序列化 JSON
how to deserialize JSON with keys that are not valid Python names in marshmallow
我得到一个 JSON 对象,它有一个键 "sera:blah"
我如何使用 marshmallow 库将该对象反序列化为 python 数据类型,因为冒号是无效的 属性 名称?
编辑:
所以 类 in python 不能接受属性名称中的冒号。这是无效的语法。
编辑2:
理想情况下,我希望在 marshmallow 中有一个解决方法。
我看到你可以选择 2 条路线
- 首先尝试用
JSON.loads
对其进行反序列化,然后遍历每个 属性 并在将其提供给棉花糖之前替换所有格式错误的键,或者
- 在喂棉花糖之前使用
JSON.JSONDecoder
class and roll your own object_hook
function. Then call the .decode()
功能。
我对后者进行了扩展(我认为更合适)
from json import loads, JSONDecoder
s = """{
"obj1": 123,
"list": [
{"example2": 42},
{"sera:blah": false},
{"object:3": {"nest:ed": "obj"}}
]
}"""
data = loads(s)
print(data)
def obj_transform(obj):
for key in obj.keys(): # Iterate through obj
if ':' in key:
obj[key.replace(':', '_')] = obj.pop(key)
return obj
decoder = JSONDecoder(object_hook=obj_transform)
print(decoder.decode(s))
打印结果:
{'obj1': 123, 'list': [{'example2': 42}, {'sera:blah': False}, {'object:3': {'nest:ed': 'obj'}}]}
{'obj1': 123, 'list': [{'example2': 42}, {'sera_blah': False}, {'object_3': {'nest_ed': 'obj'}}]}
这似乎是您要查找的内容,以净化您对棉花糖的输入。
Marshmallow 使用 data_key
属性处理此问题。
class MySchema(ma.Schema):
sara_blah = ma.fields.String(data_key="sara_blah")
(这是 marshmallow 3 语法。Marshmallow 2 使用 load_from
和 dump_to
。)
我得到一个 JSON 对象,它有一个键 "sera:blah"
我如何使用 marshmallow 库将该对象反序列化为 python 数据类型,因为冒号是无效的 属性 名称?
编辑:
所以 类 in python 不能接受属性名称中的冒号。这是无效的语法。
编辑2:
理想情况下,我希望在 marshmallow 中有一个解决方法。
我看到你可以选择 2 条路线
- 首先尝试用
JSON.loads
对其进行反序列化,然后遍历每个 属性 并在将其提供给棉花糖之前替换所有格式错误的键,或者 - 在喂棉花糖之前使用
JSON.JSONDecoder
class and roll your ownobject_hook
function. Then call the.decode()
功能。
我对后者进行了扩展(我认为更合适)
from json import loads, JSONDecoder
s = """{
"obj1": 123,
"list": [
{"example2": 42},
{"sera:blah": false},
{"object:3": {"nest:ed": "obj"}}
]
}"""
data = loads(s)
print(data)
def obj_transform(obj):
for key in obj.keys(): # Iterate through obj
if ':' in key:
obj[key.replace(':', '_')] = obj.pop(key)
return obj
decoder = JSONDecoder(object_hook=obj_transform)
print(decoder.decode(s))
打印结果:
{'obj1': 123, 'list': [{'example2': 42}, {'sera:blah': False}, {'object:3': {'nest:ed': 'obj'}}]}
{'obj1': 123, 'list': [{'example2': 42}, {'sera_blah': False}, {'object_3': {'nest_ed': 'obj'}}]}
这似乎是您要查找的内容,以净化您对棉花糖的输入。
Marshmallow 使用 data_key
属性处理此问题。
class MySchema(ma.Schema):
sara_blah = ma.fields.String(data_key="sara_blah")
(这是 marshmallow 3 语法。Marshmallow 2 使用 load_from
和 dump_to
。)