Python3 ORM, превращающий camelCase в snake_case

Мне от стороннего сервиса приходит json со строковыми полями в camelCase я могу этот json превраттить в dict и, используя dataclasses замапить ответ на python-object, однако тогда мне придется пользоваться camelCase'ом в своем python коде.

Можно ли сделать так, чтобы как в springBoot - вешаешь аннотацию на поле, обозначающую название поля, данные из которого надо замапить в помеченное аннотацией?

Например, так это выглядит в котлине и спринге: @JsonProperty("auto_renew_product_id ") val renewProductId: String?

есть ли что-то такое.в python3 ?


Ответы (1 шт):

Автор решения: gil9red

Насчет сериализации в поля с указанием имени ключа JSON не смогу подсказать, но пример приведения строки в snake_case и создание нового словаря с ключами с snake_case, пожалуйста.

Пример:

import re

def camel_to_snake(name: str) -> str:
    return re.sub(r'(?<!^)(?=[A-Z])', '_', name).lower()

def deep_camel_to_snake(d: dict) -> dict:
    new_dict = dict()
    for k, v in d.items():
        if isinstance(v, dict):
            v = deep_camel_to_snake(v)
        elif isinstance(v, list):
            v = [deep_camel_to_snake(x) if isinstance(x, dict) else x for x in v]
        new_dict[camel_to_snake(k)] = v
    return new_dict

data = {
    'dataObj': {
        'itemsObj': [
            {
                'UserName': 'xxx',
                'UserAge': 0,
            }
        ],
        'renewProductId': 1,
        'UserId': 1
    }
}
data = deep_camel_to_snake(data)
print(data)
# {'data_obj': {'items_obj': [{'user_name': 'xxx', 'user_age': 0}], 'renew_product_id': 1, 'user_id': 1}}
→ Ссылка