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 шт):
Насчет сериализации в поля с указанием имени ключа 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}}