#python #json #string #dictionary
Вопрос:
У меня есть ниже вложенный словарь строк без кавычек, который я хочу преобразовать в словарь python.
{ id: 0,
label: 'Data0',
axis: "left",
color: "#0000ff",
avg: "383.04347826086956",
last: "378.0",
min: "282.0",
max: "439.0" }
,
{ id: 1,
label: 'Data1',
axis: "left",
color: "#00ff00",
avg: "",
last: "",
min: "",
max: "" }
Ожидаемый Результат:
{ "id": 0,
"label": "Data0",
"axis": "left",
"color": "#0000ff",
"avg": 383.04347826086956,
"last": 378.0,
"min": 282.0,
"max": 439.0 }
,
{ "id: 1,
"label": "Data1",
"axis": "left",
"color": "#00ff00",
"avg": "",
"last": "",
"min": "",
"max": "" }
Основная причина этого заключается в том, что я получаю вывод в виде строки из ответа API, где он содержит много других вещей, которые я удалил с помощью метода split ().
Комментарии:
1. Откуда это берется? Это недопустимо в качестве Python или JSON.
2. Использует ли этот API известный формат? Вы можете обнаружить, что для этого вам понадобится довольно сложный синтаксический анализатор.
3. Я думаю, вам поможет, если вы покажете пример фактического ответа — то есть до того, как вы начали его изменять. Как сказал @tdelaney, если он не подходит для Python естественным образом, вам, вероятно, потребуется разработать собственный синтаксический анализатор. Удачи вам в этом
4. Я не уверен, что вы подразумеваете под «вложенным строковым словарем». Это просто строка python? Или эти словари python используют значения переменных python с именами «идентификатор», «метка» и т. Д… Если вы пытаетесь разобрать одну строку python, поместите все это в тройные кавычки python, чтобы мы знали.
5. Пожалуйста, найдите фактический исходный результат, который я получаю pastecode.io/s/x8uxaudc Здесь я хочу извлечь сводные данные
Ответ №1:
Попробуй:
js_data = """
/*
* Pure Javascript, which calls the specified callback function, specified using the Jsonp parameter
*
* Callback function is passed all parameters necessary to render chart
*/
MP.ChartController.loaded('chartdiv',
{
error: '',
width: 1480,
height: 308,
summaryData: [
{
id: 0,
label: 'Data0',
axis: "left",
color: "#0000ff",
avg: "383.04347826086956",
last: "378.0",
min: "282.0",
max: "439.0"
},
{
id: 1,
label: 'PQ Initiated',
axis: "left",
color: "#00ff00",
avg: "",
last: "",
min: "",
max: ""
}
],
graphType: 'chart',
warnings: []
});
"""
import re
import json
# find `summaryData`
summary_data = re.search(r"summaryData: ([.*?]),", js_data, flags=re.S)
# add quotes("") around keys
summary_data = re.sub(r"(S ):", r'"1":', summary_data.group(1))
# replace ' to "
summary_data = summary_data.replace("'", '"')
# decode the string:
summary_data = json.loads(summary_data)
print(summary_data)
С принтами:
[
{
"id": 0,
"label": "Data0",
"axis": "left",
"color": "#0000ff",
"avg": "383.04347826086956",
"last": "378.0",
"min": "282.0",
"max": "439.0",
},
{
"id": 1,
"label": "PQ Initiated",
"axis": "left",
"color": "#00ff00",
"avg": "",
"last": "",
"min": "",
"max": "",
},
]
Комментарии:
1. Это решение зависит от данных. если значение имеет значение времени , например
12:20:00
, оно не работает. Но иногда именно в этом и заключается взлом данных.