Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python解析复杂的JSON_Python_Json_Parsing - Fatal编程技术网

用Python解析复杂的JSON

用Python解析复杂的JSON,python,json,parsing,Python,Json,Parsing,我对JSON和Python非常陌生,并且尝试使用GET请求得到的复杂JSON输出。这是JSON输出的一个示例(这只是其中的一小部分,但原理是一样的): 我试图找到打印单个值的最佳方法。例如,我需要“connectivityStatus”的值。任何帮助都将不胜感激 我能够解析简单的JSON输出。我已成功获取整个内部集树: x = requests.get('website.com) d = x.json() print (d['innerSet']) 但是,我不能按较低的键。例如,获取“clu

我对JSON和Python非常陌生,并且尝试使用GET请求得到的复杂JSON输出。这是JSON输出的一个示例(这只是其中的一小部分,但原理是一样的):

我试图找到打印单个值的最佳方法。例如,我需要“connectivityStatus”的值。任何帮助都将不胜感激

我能够解析简单的JSON输出。我已成功获取整个内部集树:

x = requests.get('website.com)
d = x.json() print (d['innerSet']) 
但是,我不能按较低的键。例如,获取“clusterUID”中“id”键的值:

导致以下错误:TypeError:列表索引必须是整数,而不是str

问候,, 雅基尔。

您可以这样做:

import simplejson as json
data = json.loads(s)
print data['innerSet'][0]['rpasState'][0]['remoteRPAsDataLinkStatus'][0]['connectivityStatus']

对于复杂的JSON,您可以像Xpath一样使用它,但使用dict

根据您的json,您可以将其解析为:

print(list(dpath.util.search(t, '**/connectivityStatus', yielded=True)))
print(dpath.util.get(t, '/innerSet/0/rpasState/0/remoteRPAsDataLinkStatus/0/connectivityStatus'))

[('innerSet/0/rpasState/0/remoteRPAsDataLinkStatus/0/connectivityStatus', 'OK')]
OK

看看
json
模块…在谷歌上写:
pythonjson
你会得到你需要的一切。谢谢!成功了。您能否解释何时(以及为什么)需要包含这些“[0]”的路径?我希望能够在JSON解析的其余部分实现它。再次感谢!之所以存在
[0]
,是因为您访问了列表的第一个元素。“innerSet”后面的方括号“:[指定innerSet是一个列表,类似于rpasState,remoteRPAsDataLinkStatus。为什么使用json库会引发错误?应该必须使用simplejson吗?谢谢您,也可以。不过,第一个建议给出了所有错误它可以找到“connectivityStatus”键(有意义)。但是这个模块的用法很简单明了。谢谢。这种方法适合复杂的JSON,比如REST响应。
import simplejson as json
data = json.loads(s)
print data['innerSet'][0]['rpasState'][0]['remoteRPAsDataLinkStatus'][0]['connectivityStatus']
print(list(dpath.util.search(t, '**/connectivityStatus', yielded=True)))
print(dpath.util.get(t, '/innerSet/0/rpasState/0/remoteRPAsDataLinkStatus/0/connectivityStatus'))

[('innerSet/0/rpasState/0/remoteRPAsDataLinkStatus/0/connectivityStatus', 'OK')]
OK