我得到了一个带有密钥"sera:blah"
的 JSON 对象
如何使用棉花糖库将该对象反序列化为 python 数据类型,因为该冒号是无效的属性名称?
编辑:
因此,python 中的类不能接受名称中的冒号。这是无效的语法。
编辑2:
理想情况下,我想在棉花糖中有一个解决方法。
我看到你可以用这个走 2 条路线
- 首先尝试使用
JSON.loads
对其进行反序列化,然后循环访问每个属性并替换所有格式错误的键,然后再将其提供给棉花糖,或者 - 使用
JSON.JSONDecoder
类并滚动自己的object_hook
函数。然后在将其喂入棉花糖之前调用.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")
(这是棉花糖 3 语法。棉花糖2使用load_from
和dump_to
。