2017-08-03 38 views
1

我想創建一個類的JSON表示並自動將屬性名稱從snake_case更改爲lowerCamelCase,因爲我希望遵守Python中的PEP8以及JavaScript命名約定(甚至更重要的是,我要通信的後端使用lowerCamelCase)。JSON序列化一個類並用Python更改屬性套管

我更喜歡使用標準的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"}' 

回答

1

您只需要創建一個函數將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)) 

輸出

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

可以serialiselambda,但我認爲這是更具可讀性它寫成一個適當的def功能。