JSON сериализует класс и изменяет корпус свойства с помощью Python

Я хотел бы создать 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"}'

person Vince Varga    schedule 03.08.2017    source источник


Ответы (1)


Вам просто нужно создать функцию для преобразования ключей snap_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))

вывод

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

Вы могли поместить serialise в lambda, но я думаю, что более читабельно написать это как правильную функцию def.

person PM 2Ring    schedule 03.08.2017