我想解析從Web服務中獲取的JSON到對象結構中。因此,我正在使用object_hook
方法實現json.JSONDecoder
的子類。我還沒有找到一個好方法,但是爲給定的數據選擇正確的類。對於具有相同屬性的類,似乎不可能識別出正確的類,因爲這需要知道密鑰。讓我們來看一個例子:如何正確將JSON轉換爲Python對象?
我有以下類別:
class Post:
def __init__(self, title, user=None, group=None):
self.title = title
self.user = user
self.group = group
class Group:
def __init__(self, name):
self.name = name
class User:
def __init__(self, name):
self.name = name
可觀察到Group
和User
類具有相同的屬性。現在我JSONDecoder看起來是這樣的:
class JSONDecoder(json.JSONDecoder):
def __init__(self, encoding="UTF-8"):
json.JSONDecoder.__init__(self, object_hook=self.dict_to_object)
def dict_to_object(self, d):
if "posts" in d:
return d["posts"]
if "title" in d:
if "user" in d:
return Post(d["title"], user=d["user"])
if "group" in d:
return Post(d["title"], group=d["group"])
if "name" in d:
# How to decide if User(d["name"]) or Group(d["name")?
return None
return None
當它看到包含密鑰「名」的字典,它不能決定是否要創建一個Group
或User
對象(因此我此刻返回None
)。
JSON字符串我想解析如下所示:
s = """
{ "posts" : [
{"title" : "Hello World", "user" : {"name" : "uli"}},
{"title" : "Hello Group", "group" : {"name" : "Workgroup"}}
]
}
"""
這將導致後對象的列表,每個都具有一個標題和一個組或用戶。
這怎麼能以最好的方式解決?這是否積累了if
-dict_to_object
真的要走的路? (由於嵌套的JSON結構是完整的,所以實際代碼看起來更加混亂。)或者是否還有其他模式或庫應該使用? (雖然我寧願去用標準庫。)
你能展示一個你想要解析的JSON的例子,以及你想分析它的對象嗎? – BrenBarn 2014-10-29 21:35:34
好點!我添加了示例JSON。我希望我想要的對象結構現在已經很清楚了。 – Robert 2014-10-29 21:48:44
解析JSON後,您可能會更好地「手動」創建對象。然後,您可以通過嵌套的字典遞歸地迭代,並以您需要的任何方式使用鍵和值。 – BrenBarn 2014-10-29 21:53:24