JSON 序列化一个 class 并用 Python 改变 属性 大小写
JSON serialize a class and change property casing with Python
我想创建一个 class 的 JSON 表示并自动将 属性 名称从 snake_case
更改为 lowerCamelCase
,因为我我想遵守 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"}'
您只需要创建一个函数来将 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"
}
您 可以 将 serialise
放入 lambda
中,但我认为将其编写为适当的 def
函数更具可读性。
我想创建一个 class 的 JSON 表示并自动将 属性 名称从 snake_case
更改为 lowerCamelCase
,因为我我想遵守 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"}'
您只需要创建一个函数来将 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"
}
您 可以 将 serialise
放入 lambda
中,但我认为将其编写为适当的 def
函数更具可读性。