Я получаю файл 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"
}