我想解析从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