Разбор вложенных JSON с использованием python - PullRequest
0 голосов
/ 26 марта 2020

У меня есть сценарий, где у меня есть данные ниже JSON, которые я хочу проанализировать и сохранить результаты в формате dict при следующих условиях:

Condt -> Parse through json и найти в data если groupProperty равно Tests, вернуть groupValue и value в диктовке.

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

Любая помощь будет отличной!

Ответы [ 3 ]

0 голосов
/ 26 марта 2020

Вы не заметили, что 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)
0 голосов
/ 26 марта 2020

Рекурсивный поиск с меньшим количеством предположений о структуре 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 Демо

0 голосов
/ 26 марта 2020

Здесь нет особой проблемы: просто нужно быть очень осторожным при написании понимания:

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