简体   繁体   中英

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.

You can do this:

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM