Reputation: 257
I'm quite new with JSON and Python and trying to work with complex JSON outputs that I'm getting with GET requests. This is one example of JSON output (this is a small part of it but the principle is the same):
{
"innerSet": [
{
"clusterUID": {
"id": 3585057579401361143
},
"rpasState": [
{
"rpaUID": {
"clusterUID": {
"id": 3585057579401361143
},
"rpaNumber": 1
},
"status": "OK",
"repositoryConnectivityStatus": {
"accessStatus": "OK",
"multipathingProblems": false
},
"remoteRPAsDataLinkStatus": [
{
"JsonSubType": "RPAConnectivityStatus",
"clusterUID": {
"id": 2671811049708195677
},
"entityType": "RPA",
"connectivityStatus": "OK",
"rpaUID": {
"clusterUID": {
"id": 2671811049708195677
},
"rpaNumber": 1
}
}
],
}
]
}
]
}
I trying to find the best way to print a single value. For example, I need the value of "connectivityStatus". Any help will be much appreciated.
I able to pars simple JSON output. I have managed to get the entire innerSet tree:
x = requests.get('website.com)
d = x.json() print (d['innerSet'])
However, I'not able to go the lower keys. For example, getting the value for "id" key in "clusterUID":
print (d['innerSet']['clusterUID']['id'])
Results in the following error: TypeError: list indices must be integers, not str
Regards, Yakir.
Upvotes: 2
Views: 16132
Reputation: 6792
For complex JSON, you can user dpath it's like Xpath but on dict.
according to your json you could parse it as:
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
Upvotes: 1
Reputation: 1922
You can do this:
import simplejson as json
data = json.loads(s)
print data['innerSet'][0]['rpasState'][0]['remoteRPAsDataLinkStatus'][0]['connectivityStatus']
Upvotes: 1