【问题标题】:Parsing complex JSON with Python使用 Python 解析复杂的 JSON
【发布时间】:2015-08-31 12:56:20
【问题描述】:

我对 JSON 和 Python 很陌生,并尝试处理通过 GET 请求获得的复杂 JSON 输出。这是JSON输出的一个例子(这是一小部分但原理相同):

{
  "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
              }
            }
          ],
         }
      ]
    }
 ]
}

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

我能够解析简单的 JSON 输出。我设法得到了整个 innerSet 树:

x = requests.get('website.com)
d = x.json() print (d['innerSet']) 

但是,我无法使用较低的键。例如,获取“clusterUID”中“id”键的值:

print (d['innerSet']['clusterUID']['id']) 

导致以下错误:TypeError: list indices must be integers, not str

问候, 亚基尔。

【问题讨论】:

  • 看看json 模块...
  • 在谷歌上写:python json,你会得到你需要的一切。

标签: python json parsing


【解决方案1】:

你可以这样做:

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

【讨论】:

  • 谢谢!那行得通。你能解释一下何时(以及为什么)需要包含这些“[0]”的路径吗?我希望能够在 JSON 解析的其余部分实现它。再次感谢!
  • [0] 存在是因为您访问了列表的第一个元素。
  • innerSet后面的方括号:[指定innerSet是一个列表,类似rpasState,remoteRPAsDataLinkStatus。
  • 为什么使用json库会报错?一定要使用simplejson吗?
【解决方案2】:

对于复杂的 JSON,您可以使用 dpath 它就像 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

【讨论】:

  • 也谢谢你,工作也很好。然而,第一个建议给出了它可以找到的所有“connectivityStatus”键(有意义)。但是这个模块的使用是清晰和简单的。谢谢。
  • 这种方法适用于复杂的 JSON,如 REST 响应。
猜你喜欢
  • 2021-09-09
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多