2017-03-18 59 views
-2

我试图转换json字符串model如何转换JSON在python3

话,很容易与.

我已经检查another question

但不同中获取价值,我的JSON刺痛模型看起来像,

{ 
    "id":"123", 
    "name":"name", 
    "key":{ 
     "id":"345", 
     "des":"des" 
    }, 
} 

我更喜欢使用2类像,

class A: 
    id = '' 
    name = '' 
    key = new B() 


class B: 
    id = '' 
    des = '' 

回答

1

为了做到这一点,你应该提供您的自定义的回调为object_hook参数的json.loads功能。

object_hook是一个可选的功能,将与任何对象文本解码(一个dict)的 结果被调用。将使用 object_hook的返回值代替dict。此功能 可用于实现自定义解码器(例如JSON-RPC类提示)。

+0

感谢我给它一个尝试当然,你首先需要的 –

0

考虑使用collections.namestuple子类:

json_str = ''' 
{ 
    "id":"123", 
    "name":"name", 
    "key":{ 
     "id":"345", 
     "des":"des" 
    } 
}''' 

B = collections.namedtuple('B', 'id des') 
A = collections.namedtuple('A', 'id name key') 

def make_models(o): 
    if 'key' in o: 
     return A(o['id'], o['name'], B(id=o['key']['id'], des=o['key']['des'])) 
    else: 
     return o 

result = json.loads(json_str, object_hook=make_models) 

print(type(result)) # outputs: <class '__main__.A'> 
print(result.id)  # outputs: 123 
print(result.key.id) # outputs: 345 
+0

如何获得堆性能,我是新的python和python 3.6,谢谢 –

+0

正如你看到'collections.namedtuple('B','id des')':'id'和'des'是属性。以相同的方式添加新属性 – RomanPerekhrest

+0

是的,我明白了你的意思,但是有时候json的关键字是一个关键字,比如'class'或'str',我有100个属性。 –