如何使用棉花糖中不是有效 Python 名称的键反序列化 JSON



我得到了一个带有密钥"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_fromdump_to

最新更新