Преобразуйте файл JSON, чтобы уменьшить уровни - PullRequest
0 голосов
/ 04 июля 2019

Я получаю файл JSON с результатом некоторого теста.Иерархия данных: [{date, [ test -> {time, result}]}], и нам нужно преобразовать ее во что-то более «пригодное для использования», например {date&time, (test: result)}

Мы используем этот код:

import json

with open('test_result.json', 'r') as f:
    main_struct = json.load(f)

transformed = {}

main_date = main_struct.get('date')

for main_key, main_value in main_struct.items():
    if isinstance(main_value, list):
        for inner_key in main_value:
            transform_key = main_date + 'T' + inner_key.get('time')
            if transform_key not in transformed:
                transformed[transform_key] = {}
            for innest_key, innest_value in inner_key.items():
                if innest_key == 'value':
                    transfom_inner_key = main_key
                else:
                    transfom_inner_key = main_key + "." + innest_key
                if innest_key != 'time':
                    transformed[transform_key][transfom_inner_key] = innest_value
    else:
        transformed[main_key] = main_value

with open('transform.json', 'w') as outfile:
    json.dump(transformed, outfile, sort_keys=True, indent=4)

Хотя код работает, у меня естьнекоторые проблемы с читабельностью и, возможно, существует какая-то библиотека, которая может помочь уменьшить сложность кода.

Это содержимое входного файла JSON:

   [
    {
       "date": "2019-05-19",
       "test1": [
           { "time": "14:00:00", "value": 10 },
           { "time": "15:00:00", "value": 12 },
           { "time": "17:00:00", "value": 16 }
        ],
       "test2": [
           { "time": "14:00:00", "value": 11 },
           { "time": "16:00:00", "value": 15 },
           { "time": "17:00:00", "value": 17 }
        ],
       "test3": [
           { "time": "15:00:00", "value": "B", "additionalInfo": "Additional information at 15h" },
           { "time": "16:00:00", "value": "C" },
           { "time": "17:00:00", "value": "D", "additionalInfo": "Additional information at 17h" }
        ],
        "generated_by": "author of tests"
    }
]

, и это ожидаемый результат:

{
    "2019-05-19T14:00:00": {
        "test1": 10,
        "test2": 11
    },
    "2019-05-19T15:00:00": {
        "test1": 12,
        "test3": "B",
        "test3.additionalInfo": "Additional information at 15h"
    },
    "2019-05-19T16:00:00": {
        "test2": 15,
        "test3": "C"
    },
    "2019-05-19T17:00:00": {
        "test1": 16,
        "test2": 17,
        "test3": "D",
        "test3.additionalInfo": "Additional information at 17h"
    },
    "date": "2019-05-19",
    "generated_by": "author of tests"
}

1 Ответ

0 голосов
/ 04 июля 2019
data = '''  [
    {
       "date": "2019-05-19",
       "test1": [
           { "time": "14:00:00", "value": 10 },
           { "time": "15:00:00", "value": 12 },
           { "time": "17:00:00", "value": 16 }
        ],
       "test2": [
           { "time": "14:00:00", "value": 11 },
           { "time": "16:00:00", "value": 15 },
           { "time": "17:00:00", "value": 17 }
        ],
       "test3": [
           { "time": "15:00:00", "value": "B", "additionalInfo": "Additional information at 15h" },
           { "time": "16:00:00", "value": "C" },
           { "time": "17:00:00", "value": "D", "additionalInfo": "Additional information at 17h" }
        ],
        "generated_by": "author of tests"
    }
]'''

import json
from collections import defaultdict

out = defaultdict(dict)
for i in json.loads(data):
    d = i['date']
    for k, v in i.items():
        if not isinstance(v, list):
            continue
        for vv in v:
            out[d + 'T' + vv['time']][k] = vv['value']
            if 'additionalInfo' in vv:
                out[d + 'T' + vv['time']][k + '.additionalInfo'] = vv['additionalInfo']
    out['date'] = d
    out['generated_by'] = i['generated_by']


print(json.dumps(out, indent=4))

Отпечатки:

{
    "2019-05-19T14:00:00": {
        "test1": 10,
        "test2": 11
    },
    "2019-05-19T15:00:00": {
        "test1": 12,
        "test3": "B",
        "test3.additionalInfo": "Additional information at 15h"
    },
    "2019-05-19T17:00:00": {
        "test1": 16,
        "test2": 17,
        "test3": "D",
        "test3.additionalInfo": "Additional information at 17h"
    },
    "2019-05-19T16:00:00": {
        "test2": 15,
        "test3": "C"
    },
    "date": "2019-05-19",
    "generated_by": "author of tests"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...