2017-05-21 44 views
-1

我是新來的python,並將JSON解碼爲Python類時出現問題。例如:將JSON解碼爲python對象

如果我們有一個Python類代表人數:

Class Person: 
    def __init__(self, Fname, Lname, Age): 
     self.FirstName = Fname 
     self.LastName = Lname 
     self.Age = Age 

現在我有一個JSON,讓我們說,例如我是從一個web服務機構或東西,它是這樣的:

JsonOBJ = {"FirstName":"Mostafa","LastName":"Mohamed","Age":"26"} 

我需要解碼該JSON具有填充有值類型Person的一個對象,並訪問諸如其屬性:

Obj.FirstName 

謝謝。

回答

0

是否有理由需要全班實施?如果你只是想通過鍵訪問屬性而不使用字典,你可以創建一個namedtuple。

from collections import namedtuple 

def dict_to_namedtuple(d): 
    # This sets up a namedtuple called 'Person' with the provided keys 
    # It then creates the namedtuple with the unpacked dict 
    return namedtuple('Person', d.keys())(**d) 

d = {"FirstName":"Mostafa","LastName":"Mohamed","Age":"26"} 
person = dict_to_named_tuple(d) 

print(person) 
# Person(FirstName='Mostafa', LastName='Mohamed', Age='26') 

print(person.FirstName) 
# 'Mostafa' 
+0

謝謝...工作完美,我只需要將JSON字符串轉換爲字典第一。謝啦 – Mostafa

2

如果你已經有了JSON字符串Python字典,你可以使用**簡單地擴展它:

p = Person(**{'Fname': 'a', 'Lname': 'b', 'Age': 11}) 
print(p.FirstName) 
# a 

如果你不這樣做,另一種選擇是創建一個知道如何創建一個類的方法Person來自JSON字符串的對象。通過這種方式,創建邏輯以某種方式從調用代碼封裝:

class Person: 
    def __init__(self, Fname, Lname, Age): 
     self.FirstName = Fname 
     self.LastName = Lname 
     self.Age = Age 

    @classmethod 
    def from_json_string(cls, json_string): 
     dict_obj = json.loads(json_string) 
     return cls(**dict_obj) 

p = Person.from_json_string('{"Fname": "a", "Lname": "b", "Age": 11}') 

print(p.FirstName) 
# a 

請記住,無論我發現使用**擴大字典單一參數Person.__init__的途徑。這意味着密鑰必須與__init__預期的參數相匹配。如果他們不這樣做,則需要將正確的密鑰/值傳遞給__init__而不是使用**