使用 Python JSON 序列化类并更改属性大小写

Vin*_*rga 5 python serialization json camelcasing

我想创建一个类的 JSON 表示形式,并自动将属性名称从 更改snake_caselowerCamelCase,因为我想遵守 Python 中的 PEP8 以及 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"}'
Run Code Online (Sandbox Code Playgroud)

PM *_*ing 5

您只需要创建一个函数将snake_case 键转换为camelCase。您可以使用.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))
Run Code Online (Sandbox Code Playgroud)

输出

{
    "vmSize": "Large",
    "someOtherThing": 42,
    "a": "a"
}
Run Code Online (Sandbox Code Playgroud)

可以放入serialisea lambda,但我认为将其编写为适当的def函数更具可读性。