Как преобразовать словарь вложенных строк без кавычек в словарь на Python

#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 , оно не работает. Но иногда именно в этом и заключается взлом данных.