У меня есть объект unicode, который должен представлять json, но он содержит в нем юникод u как часть строкового значения, например. u'{u\'name\':u\'my_name\'}'
Моя цель - загрузить это в объект json. Просто использовать json.loads не удастся. Я знаю, что это происходит из-за u внутри string, которые не являются частью приемлемого формата json.
Тогда я устал безуспешно дезинфицировать string с помощью replace("u\'", "'"), encode('ascii', 'ignore') и других методов.
Что в итоге сработало, так это использование ast.literal_eval, но я беспокоюсь об его использовании. Я нашел несколько источников в Интернете, заявляющих о его безопасно. Но я также нашел другие источники, утверждающие, что это плохая практика, и ее следует избегать.
Есть ли другие методы, которые мне не хватает?
@dawg спасибо за быстрый ответ. Желательно ли попробовать заменить значения u и т. д.? Есть ли у ast.literal_eval отрицательные стороны?
Спасибо за помощь @dawg
@GuyGrin, я обновил свой ответ еще одним методом. Пожалуйста, проверьте, он позволяет использовать модуль json. Обратите внимание, что JSON (нотация объектов JavaScript) предлагает " (двойные кавычки) для окружения ключей и строк. И это повод для json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1). Я также предложил способ Небезопасно, просто игнорируйте его, если хотите. Вам нужно будет найти способ, если ваша строка данных содержит u как часть исходных данных.






Строка Unicode - это результат вызова unicode в словаре.
>>> d = {u'name': u'myname'}
>>> u = unicode(d)
>>> u
u"{u'name': u'myname'}"
Если вы контролируете код, который это делает, лучшим решением будет заменить его вызовом json.dumps.
>>> json.dumps(d)
'{"name": "myname"}'
Если вы не контролируете создание этого объекта, вам нужно будет использовать ast.literal_eval для создания словаря, так как строка Unicode не является допустимой json.
>>> json.loads(u)
Traceback (most recent call last):
...
ValueError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
>>> ast.literal_eval(u)
{u'name': u'myname'}
документы подтверждает, что ast.literal_eval безопасен:
can be used for safely evaluating strings containing Python values from untrusted sources
Вместо этого вы мог используете eval, но, поскольку вы не контролируете создание объекта, вы не можете быть уверены, что он не был создан злоумышленником, чтобы нанести ущерб вашей системе.
ast.literal_evalявляется сейф.