Yakir Mordehay
Yakir Mordehay

Reputation: 257

Parsing complex JSON with Python

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

Answers (2)

Ali SAID OMAR
Ali SAID OMAR

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

rkrzr
rkrzr

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

Related Questions