繁体   English   中英

使用python解析嵌套的JSON

[英]parsing nested JSON using python

我有一个场景,我有以下 JSON 数据,我想在这些条件下解析结果并将结果存储在 dict 中:

Condt - >解析通过JSON和下找到data ,如果groupProperty等于Tests ,然后返回groupValuevalue的字典。

{
  "dateFrom": "2020-03-26 07:35:00",
  "dateTo": "2020-03-26 07:40:00",
  "groupLabels": [
    {
      "groupProperty": "Tests",
      "groupLabels": [
        {
          "groupId": "1053777",
          "groupLabel": "testappzxco"
        },
        {
          "groupId": "570009",
          "groupLabel": "testappzkbo"
        }
      ]
    }
  ],
  "binSize": 300,
  "data": {
    "points": [
      {
        "timestamp": 1585208100,
        "numberOfDataPoints": 24,
        "value": 0,
        "groups": [
          {
            "groupProperty": "Tests",
            "groupValue": "1053777"
          },
          {
            "groupProperty": "Test Labels",
            "groupValue": "61776"
          }
        ]
      },
           {
        "timestamp": 1585208100,
        "numberOfDataPoints": 5,
        "value": 4.888970,
        "groups": [
          {
            "groupProperty": "Tests",
            "groupValue": "1241460"
          },
          {
            "groupProperty": "Test Labels",
            "groupValue": "61710"
          }
        ]
      },
      {
        "timestamp": 1585208100,
        "numberOfDataPoints": 96,
        "value": 0,
        "groups": [
          {
            "groupProperty": "Test Labels",
            "groupValue": "61770"
          }
        ]
      },
      {
        "timestamp": 1585208100,
        "numberOfDataPoints": 101,
        "value": 0.01980198019801982,
        "groups": [
          {
            "groupProperty": "Test Labels",
            "groupValue": "61773"
          }
        ]
      },
      {
        "timestamp": 1585208100,
        "numberOfDataPoints": 104,
        "value": 0,
        "groups": [
          {
            "groupProperty": "Test Labels",
            "groupValue": "61776"
          }
        ]
      }
    ]
  }
}

我尝试过的,它甚至没有得到正确的细节:

dat = json.loads(original_data)
testl=[]
for key in dat:
    temp=key['data']['points']
    for key1 in temp:
        if key1['groups']['groupProperty'] == "Tests":
            testl.append({key1['groupValue'], key['value']
                    })

由于 json 非常复杂,我不确定如何获得所需的输出。

以下是所需的 O/P :

[{"tname":1241460, "tvalue":4.888970},{"tname":1053777, "tvalue":0}]

任何帮助都会很棒!

这里没有什么特别的问题:你只需要在写理解时非常谨慎:

[{"tname": g['groupValue'], 'tvalue': da['value']}
 for da in d['data']['points'] for g in da['groups'] if g['groupProperty'] == 'Tests']

使用提供的样本,它按预期给出:

[{'tname': '1053777', 'tvalue': 0}, {'tname': '1241460', 'tvalue': 4.88897}]

您没有注意到组也是一个数组,这样它应该可以工作:

points=dat['data']['points']
for key1 in points:
    groups = key1['groups']
    value = key1['value']
    for group in groups:
        if group['groupProperty'] =='Tests':
            testl.append({'tname':group['groupValue'], 'value':value})

print (testl)

dat结构做出较少假设的递归搜索:

testl = []

def search(obj, seen_data, value):
    if isinstance(obj, list):
        for x in obj:
            search(x, seen_data, value)
    elif isinstance(obj, dict):
        if not seen_data:
            if 'data' in obj:
                seen_data = True
        else:
            if value is not None:
                if 'groupProperty' in obj and obj['groupProperty'] == 'Tests':
                    if 'groupValue' in obj:
                        tests = obj['groupValue']
                        testl.append({'tname': tests, 'tvalue': value})
                        value = None
            elif 'value' in obj:
                value = obj['value']
        for x in obj.values():
            search(x, seen_data, value)

search(dat, False, None)
print(testl)

印刷:

[{'tname': '1053777', 'tvalue': 0}, {'tname': '1241460', 'tvalue': 4.88897}]

见 Python 演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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