python - JSON序列化一个类并用Python改变属性大小写

标签 python json serialization camelcasing

我想创建一个类的 JSON 表示,并自动将属性名称从 snake_case 更改为 lowerCamelCase,因为我想遵守 PEP8 Python 和 JavaScript 命名约定(也许更重要的是,我正在与之通信的后端使用 lowerCamelCase)。

我更喜欢使用标准的 json 模块,但我并不反对使用另一个开源库(例如 jsonpickle 可能会解决我的问题?)。

>>> class HardwareProfile:
...     def __init__(self, vm_size):
...             self.vm_size = vm_size
>>> hp = HardwareProfile('Large')
>>> hp.vm_size
'Large'
### ### What I want ### ###
>>> magicjson.dumps(hp)
'{"vmSize": "Large"}'
### ### What I have so far... ### ###
>>> json.dumps(hp, default=lambda o: o.__dict__)
'{"vm_size": "Large"}'

最佳答案

您只需创建一个函数来将 snake_case 键转换为驼峰式。您可以使用 .split 轻松做到这一点, .lower , 和 .title .

import json

class HardwareProfile:
    def __init__(self, vm_size):
        self.vm_size = vm_size
        self.some_other_thing = 42
        self.a = 'a'

def snake_to_camel(s):
    a = s.split('_')
    a[0] = a[0].lower()
    if len(a) > 1:
        a[1:] = [u.title() for u in a[1:]]
    return ''.join(a)

def serialise(obj):
    return {snake_to_camel(k): v for k, v in obj.__dict__.items()}

hp = HardwareProfile('Large')
print(json.dumps(serialise(hp), indent=4, default=serialise))

输出

{
    "vmSize": "Large",
    "someOtherThing": 42,
    "a": "a"
}

可以serialiselambda , 但我认为将其写成适当的 def 更具可读性功能。

关于python - JSON序列化一个类并用Python改变属性大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45475341/

相关文章:

WPF 位图图像序列化/反序列化

python - 为什么在我的 Windows 机器上,我必须将命令写为 "py -m pip install "模块名”而不是只写 "pip install "模块名”?

javascript - 使用关键字搜索 json

java - 我收到 java.lang.ClassCastException 但我发送的是对象,而不是字符串

用于显示高级自定义字段的 JSON API - WordPress

javascript - 需要访问 JSON.stringify 对象中的数据

.net - 使用 .Net OnSerializingAttribute 更改变量名称?

python - 在 Python 中使用 MySQL 表作为线程队列

Python 生成器与列表作为数组初始值设定项

python - 尝试使用 Gunicorn 启动 FLASK 应用程序时,Python 中的 Catch 22