如何使用棉花糖中无效的 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_fromdump_to。)