2014-08-28 49 views
1

我使用JSON庫來解碼JSON文本如何從python中的json文本解析類對象列表?

import json 

我已經定義了這樣的黨課:

class Party(object): 
    id = "" 
    code = "" 
    create_date = "" 
    citizenship = "" 

的object_hook方法:

def as_party(d): 
    p = Party() 
    p.__dict__.update(d) 
    return p 

我可以使用此方法爲了從json文本中獲得Party對象:

def parse_as(s, typo_class): 
    return json.loads(str(s), object_hook=typo_class) 

當我在包含編碼Party類的json文本上調用parse_as方法時,我得到一個類型爲Party的對象。

json_text = {'id': 2, 'code': '2', 'create_date': null, 'citizenship': null} 
party1 = parse_as(json_text, as_party) 

我可以調用它的屬性是這樣的:

print party1.code 

我的問題是使parse_as方法能夠解析包含這樣一個黨的對象列表一個JSON文本:

json_text = [{'id': 2, 'code': '2', 'create_date': null, 'citizenship': null}, {'id': 5, 'code': '3', 'create_date': null, 'citizenship': null}, {'id': 6, 'code': '8', 'create_date': null, 'citizenship': null}] 

請幫助我,並提前致謝!

回答

2

對象掛鉤必須

def as_party(d): 
    if isinstance(d, dict): 
     p = Party() 
     p.__dict__.update(d) 
    elif isinstance(d, list): 
    out = [] 
    for i in d: 
     n = Party() 
     n.__dict__.update(i) 
     out.append(n) 
    p = out 
    else: 
     raise Exception('got non-dict value %s' % d) 
    return p 

BTW改變,我wouldnt使用__dict__,寧可使用SETATTR一些前綴...

因爲如果鍵值是一個Python關鍵字,那不會是好。

>>> a = Foo() 
>>> a.__dict__['except'] = 1 
>>> a.except 
    File "<stdin>", line 1 
    a.except 
     ^
SyntaxError: invalid syntax 
+0

謝謝你的解決方案:)你能解釋你的其他選擇(使用setattr)嗎? – Oussama 2014-08-29 14:58:55

1

,作爲使用SETATTR,避免蟒蛇關鍵字colision你可以用不同的方法:

def as_party(d): 
    if isinstance(d, dict): 
     p = Party() 
     for k,v in d.iteritems(): 
     setattr(p, 'v_%s' % k, v) # you can assign any prefix you want 
    elif isinstance(d, list): 
    out = [] 
    for i in d: 
     n = Party() 
     for k,v in i.iteritems(): 
     setattr(n, 'v_%s' % k, v) 
     out.append(n) 
    p = out 
    else: 
     raise Exception('got non-dict value %s' % d) 
    return p 

但隨後你會與我們納入像這樣的前綴來訪問這些值:

print party.v_for,party.v_except#etc ..

一般來說,你可以計算出它不允許使用python關鍵字的代碼:

import keyword 

def as_party(d): 
    if isinstance(d, dict): 
     p = Party() 
     for k,v in d.iteritems(): 
     if keyword.iskeyword(k): 
      raise Exception('Cannot accept %s as a property name. That is resrved python keyword' % k) 
     setattr(p, k, v) # you can assign any prefix you want 
    elif isinstance(d, list): 
    out = [] 
    for i in d: 
     n = Party() 
     for k,v in i.iteritems(): 
     if keyword.iskeyword(k): 
      raise Exception('Cannot accept %s as a property name. That is resrved python keyword' % k) 
     setattr(n, k, v) 
     out.append(n) 
    p = out 
    else: 
     raise Exception('got non-dict value %s' % d) 
    return p