将JSON对象转换为Python字典

14

我有一串数据,其中包含有对象,这些对象又包含其他对象。

{"id":"XXXX", "name": "xyz", "user" : { "id": "XXXX", "username":"XYZ", group:{"id": "XXXX"}}}. You can check this format using "http://chris.photobooks.com/json/default.html" site.

不,我的要求是将它转换为JSON对象作为字典。我已经尝试了以下方式。


import json
JSON_Datalist = '{"id":"XXXX", "name": "xyz", "user" : { "id": "XXXX", "username":"XYZ", group:{"id": "XXXX"}}}'
the_dict = json.loads(JSON_DataList)

但是 the_dict 只提供左侧值,没有右侧值...

同样,如果字符串具有格式...

"[{"sample": false, "radop": null, "view": true, "Example1": null}, {"noMarket": false, "Example2": null}]"

并遵循相同的代码。

JSON_Datalist = '[{"sample": false, "radop": null, "view": true, "Example1": null}, {"noMarket": false, "Example2": null}]'

the_dict = json.loads(JSON_DataList)

它给出了长度为2的字典,这正是预期的结果...

请问在第一种情况下如何获得一个字典,可以有人帮我吗?


1
你的JSON格式不正确,需要将 group 用引号括起来。 - Mechanical snail
2
专业提示:如果你想要有效的JSON,可以像这样做:import json; json.dumps({'key': 'val', 'other_key' : {'something': [1, 2, 3]}}) - 让json库为你完成。 - Wayne Werner
3个回答

8

我在你的第一个示例中发现了两个错误:

  1. 在您的字符串化(Json)版本字典中,您有一个组(group)。这应该是一个带引号的"group"。
  2. 您拼写变量错误;JSON_Datalist ≠ JSON_DataList(小写与大写L不同)。

修复后,我再也没有遇到任何问题:

>>> JSON_Datalist = '{"id":"XXXX", "name": "xyz", "user" : { "id": "XXXX", "username":"XYZ", "group":{"id": "XXXX"}}}'
>>> the_dict = json.loads(JSON_Datalist)
>>> the_dict
{u'user': {u'username': u'XYZ', u'group': {u'id': u'XXXX'}, u'id': u'XXXX'}, u'id': u'XXXX', u'name': u'xyz'}

谢谢Alfe,现在我想获取"user:group"中存在的"id":"XXXX"的值,该如何获取?在Python中,我们可以像这样获取值the_dict['user']['group']['id'],这将打印ID值。在程序中该怎么做? - Guruswamy B M
当你提到“在Python中”和“在程序中”之间的区别时,你是指什么?就像你建议的一样,只需使用the_dict['user']['group']['id']。使用它有什么问题? - Alfe
谢谢。我知道the_dict['user']['group']['id']可以给出值,但它是静态解释器命令。在运行时,我不知道确切的命令(哪个键值)。例如:它可能是dict['user']或dict['user']['group']或dict['user']['group']['id']['etc..']['etc..']。那么你能否建议我如何在运行时生成这个解释器命令。 - Guruswamy B M
具体来说:假设我有一个名为fun1()的函数,它有一个JSON_Datalist字典。从Python中,我将通过键名调用此函数以获取值。例如,我将调用函数fun1(user:group)以获取值。在这里,参数可以是任何深度级别。 - Guruswamy B M
我理解了(我想)。请解释一下如何指定所需的值。它是符合某个条件的树中的唯一叶子吗?这个条件是什么?要在树中执行搜索,可以使用广度搜索或深度搜索或更定制的变体。但是,我需要更多了解您所处的情况,以便给出合格的建议。 - Alfe

5

修复问题后,组应该为"group",下面的代码可以满足您的要求。

json_data={"id":"XXXX", "name": "xyz", "user" : { "id": "XXXX", "username":"XYZ", "group":{"id": "XXXX"}}}
data = json.dumps(json_data)
json_to_python = json.loads(data)
print (json_to_python)


{'id': 'XXXX', 'name': 'xyz', 'user': {'id': 'XXXX', 'username': 'XYZ', 'group': {'id': 'XXXX'}}}

0

我已经想出了如何通过Python的eval表达式动态生成the_dict['user']['group']['id']

Keys是用户输入的,由:分隔。例如:user:group:id

代码:

RefCount = 0
RespDict = json.loads(JSON_Datalist.content) #convert strings to Java object using JSON
SplitKeys = Keys.split(":") 
KeyCount = len(SplitKeys)
CommandText = "RespDict" #To setup command line based on keys information
while (RefCount <KeyCount):
    CommandText = CommandText+"['"+SplitKeys[RefCount]+"']"
    RefCount = RefCount + 1
    print CommandText        
print eval(CommandText)  #Final key value

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接