2016-02-29 2 views
1

Рассмотрим следующий JSon объект:нагрузки питон ДИКТ из недействительный JSon строки

> a = {u'service': u"Lulu's Bakery"} 

Хорошо. Теперь давайте напечатаем его:

> s = str(a) 
> print s 
{u'service': u"Lulu's Bakery"} 

Вопрос в том, как разумно загрузить объект json из этой строки?

Простой подход с json.loads(s), очевидно, не будет работать здесь, так как s не является допустимой строкой json. И подход с несколькими ручными заменами, похоже, не достаточно привлекателен, потому что, например, я бы предпочел избегать дифференциации u's в u'service' и Lulu's контекстах.

Любое простое решение?

+0

во-первых, сделать 'ы = json.dumps (а)', а затем сделать 'json.loads (s)' –

+0

да, это будет работать , однако у меня уже есть куча плохих строк, которые нужно преобразовать в json-объекты ... –

+0

Можете ли вы также поддержать мой ответ? Поскольку это полностью заполняет требование вопроса. –

ответ

1

Используйте eval

Некоторые пуристы ненавидят использование eval, и это небезопасно работать на ненадежного входе (представьте, если некоторые злодеи поместить os.system("rm -rf *") в файл с расширением строк. Evaling, которые будут удалять файлы) , Но это правильный вариант для eval. eval преобразует строку, которую вы вернули в объект python. Если вы хотите, чтобы JSON для этого питона объекта вы можете дополнительно использовать json.dumps

 
In [1]: s = '''{u'service': u"Lulu's Bakery"}''' 

In [2]: s 
Out[2]: '{u\'service\': u"Lulu\'s Bakery"}' 

In [3]: x = eval(s) 

In [4]: x 
Out[4]: {u'service': u"Lulu's Bakery"} 

In [5]: import json 

In [6]: json.dumps(x) 
Out[6]: '{"service": "Lulu\'s Bakery"}' 
+0

именно то, что мне нужно, спасибо! –

Смежные вопросы