Преобразовать json в list единым алгоритмом для разных случаев
По результатам парсинга я получаю два значения, из этих значений мне нужно вытащить list data единым алгоритмом, но у меня не получается и я использую два алгоритма.
I-результаты парсинга:
[{"data":
[[1615410000000,977.42999999999995],
[1615496400000,954.64999999999998],
[1616706000000,961.98000000000002]],
"name":"\u0412\u0422\u0411 - \u0424\u043e\u043d\u0434 \u0410\u043a\u0446\u0438\u0439 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0441\u0442\u0440\u0430\u043d","tooltip":{"valueDecimals":6,"xDateFormat":"%d.%m.%Y"}}]
Выполнив код:
data = r.json()[0]['data']
Получаю:
[1615410000000,977.42999999999995]
[1615496400000,954.64999999999998]
[1616706000000,961.98000000000002]
II-результат парсинга:
{"name":"FinEx USA UCITS ETF (USD)","tooltip":{"valueDecimals":2,"xDateFormat":"%d.%m.%Y"},
"data":
[[1577998800000,3575],
[1578258000000,3560],
[1609275600000,5118],
[1609707600000,5065]]
}
Выполнив другой код:
data = json.loads(r.content)['data']
Получаю:
[[1577998800000,3575]
[1578258000000,3560]
[1609275600000,5118]
[1609707600000,5065]]
А мне нужно чтобы я единым кодом получал значения list, но никакой из этих кодов не работает на два случая.
Ответы (2 шт):
Автор решения: CrazyElf
→ Ссылка
Ну как-то так можно:
def get_data(x):
return x[0]['data'] if isinstance(x, list) else x['data']
data = get_data(r.json())
Причём, во втором случае делать json.loads(r.content) наверняка не нужно, можно просто взять r.json() как и в первом случае.
Автор решения: MaxU
→ Ссылка
Для поиска в словарях любой вложенности можно воспользоваться модулем dpath:
In [287]: data1 = [{"data":
...: [[1615410000000,977.42999999999995],
...: [1615496400000,954.64999999999998],
...: [1616706000000,961.98000000000002]],
...: "name":"\u0412\u0422\u0411 - \u0424\u043e\u043d\u0434 \u0410\u043a\u0446\u0438\u0439 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0441\u0442\u0440\u0430\u043d","tooltip":
...: {"valueDecimals":6,"xDateFormat":"%d.%m.%Y"}}]
In [288]: data2 = {"name":"FinEx USA UCITS ETF (USD)","tooltip":{"valueDecimals":2,"xDateFormat":"%d.%m.%Y"},
...: "data":
...: [[1577998800000,3575],
...: [1578258000000,3560],
...: [1609275600000,5118],
...: [1609707600000,5065]]
...: }
In [289]: import dpath.util as dpu
In [290]: dpu.values(data1, "**/data")
Out[290]: [[[1615410000000, 977.43], [1615496400000, 954.65], [1616706000000, 961.98]]]
In [291]: dpu.values(data2, "**/data")
Out[291]:
[[[1577998800000, 3575], [1578258000000, 3560], [1609275600000, 5118], [160970
7600000, 5065]]]