【问题标题】:parsing nested JSON using python使用python解析嵌套的JSON
【发布时间】:2020-03-26 16:18:42
【问题描述】:

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

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}]

任何帮助都会很棒!

【问题讨论】:

    标签: python json python-3.x python-2.7


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      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)
      

      【讨论】:

        【解决方案3】:

        递归搜索对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}]
        

        See Python Demo

        【讨论】:

        • 你的方法比 Marco 的方法有什么优势
        • 我的方法只假设键 valuegroupPropertygroupValue 在键 data 的值结构中的某个位置的字典中,但它们可以任意深入其中结构体。如果它们总是可以在例如dat['data']['points'][0]['groups'][0]['groupsProperty'] 找到,那么您就不需要这种灵活性。我只是想展示“另一种方式”。换句话说,我不假设具有键 groupsProperty 的字典的祖先是一个列表,它是键 groups 的值。
        猜你喜欢
        • 2018-05-29
        • 2019-01-18
        • 1970-01-01
        • 1970-01-01
        • 2018-09-12
        • 1970-01-01
        • 1970-01-01
        • 2019-08-20
        • 2015-08-28
        相关资源
        最近更新 更多