如何使用在marshmallow中不是有效Python名称的键反序列化JSON

2024-09-27 21:27:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我得到了一个带有键"sera:blah"的JSON对象

由于冒号是无效的属性名,如何使用棉花糖库将该对象反序列化为python数据类型

编辑:

因此python中的类不能接受porperty名称中的冒号。这是无效的语法

编辑2:

理想情况下,我希望有一个棉花糖内的解决办法


Tags: 对象名称json编辑属性序列化语法棉花
2条回答

棉花糖使用data_key属性处理这个问题

class MySchema(ma.Schema):
    sara_blah = ma.fields.String(data_key="sara_blah")

(这是棉花糖3语法。棉花糖2使用了load_fromdump_to。)

我看你可以用这个走两条路

  • 首先尝试用^{}反序列化它,并遍历每个属性并替换所有格式错误的键,然后再将其馈送到棉花糖,或者
  • 使用^{}类并滚动您自己的object_hook函数。然后在将其喂入棉花糖之前调用^{}函数

我对后者进行了扩展(我认为后者更合适)

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'}}]}

这看起来像是你在寻找的,对你输入的棉花糖进行消毒

相关问题 更多 >

    热门问题