2017-01-25 9 views
1

В этом случае проблема: у меня есть строка в следующем формате (примечание: нет разрывов строк). Я просто хочу, чтобы эта строка была сериализована в словаре python или объекте json, чтобы легко перемещаться. Я пробовал как ast.literal_eval, так и json, но конечным результатом является либо ошибка, либо просто другая строка. Я иногда царапаю голову над этим, и я знаю, что есть простое и элегантное решение, чем просто написать собственный парсер.Преобразование строки в словарь Python или объект JSON

{ 
    table_name: 

    { 
    "columns": 

    [ 
    { 

     "col_1":{"col_1_1":"value_1_1","col_1_2":"value_1_2"}, 
     "col_2":{"col_2_1":"value_2_1","col_2_2":"value_2_2"}, 
     "col_3":"value_3","col_4":"value_4","col_5":"value_5"}], 

    "Rows":1,"Total":1,"Flag":1,"Instruction":none 

    } 
} 
+0

Проблема заключается в том, что 'table_name' должны быть заключены в кавычки (двойные кавычки, если вы хотите использовать JSON) и 'none' должен быть' None' для 'ast.literal_eval' и' null' для 'JSON'. –

ответ

0

Обратите внимание, что JSON декодер ожидает от каждого имени свойства, чтобы быть заключено в двойные кавычки.
Используйте следующий подход с re.sub() и json.loads() функции:

import json, re 

s = '{table_name:{"columns":[{"col_1":{"col_1_1":"value_1_1","col_1_2":"value_1_2"},"col_2":{"col_2_1":"value_2_1","col_2_2":"value_2_2"},"col_3":"value_3","col_4":"value_4","col_5":"value_5"}],"Rows":1,"Total":1,"Flag":1,"Instruction":none}}' 
s = re.sub(r'\b(?<!\")([_\w]+)(?=\:)', r'"\1"', s).replace('none', '"None"') 
obj = json.loads(s) 

print(obj) 

Выходной сигнал:

{'table_name': {'columns': [{'col_5': 'value_5', 'col_2': {'col_2_1': 'value_2_1', 'col_2_2': 'value_2_2'}, 'col_3': 'value_3', 'col_1': {'col_1_2': 'value_1_2', 'col_1_1': 'value_1_1'}, 'col_4': 'value_4'}], 'Flag': 1, 'Total': 1, 'Instruction': 'None', 'Rows': 1}} 
+0

Спасибо, это работает! – rhm2012

+0

@ rhm2012, добро пожаловать – RomanPerekhrest