Python удаляет вложенный знак unicode 'u' из строки

У меня есть объект unicode, который должен представлять json, но он содержит в нем юникод u как часть строкового значения, например. u'{u\'name\':u\'my_name\'}'

Моя цель - загрузить это в объект json. Просто использовать json.loads не удастся. Я знаю, что это происходит из-за u внутри string, которые не являются частью приемлемого формата json.

Тогда я устал безуспешно дезинфицировать string с помощью replace("u\'", "'"), encode('ascii', 'ignore') и других методов.

Что в итоге сработало, так это использование ast.literal_eval, но я беспокоюсь об его использовании. Я нашел несколько источников в Интернете, заявляющих о его безопасно. Но я также нашел другие источники, утверждающие, что это плохая практика, и ее следует избегать.

Есть ли другие методы, которые мне не хватает?

ast.literal_evalявляется сейф.
dawg 06.01.2019 17:53

@dawg спасибо за быстрый ответ. Желательно ли попробовать заменить значения u и т. д.? Есть ли у ast.literal_eval отрицательные стороны?

Guy Grin 06.01.2019 17:59
Есть ли у ast.literal_eval отрицательные стороны? Нет, не совсем. Если это работает для ваших данных (кроме примера здесь) - используйте его.
dawg 06.01.2019 18:04

Спасибо за помощь @dawg

Guy Grin 06.01.2019 18:06

@GuyGrin, я обновил свой ответ еще одним методом. Пожалуйста, проверьте, он позволяет использовать модуль json. Обратите внимание, что JSON (нотация объектов JavaScript) предлагает " (двойные кавычки) для окружения ключей и строк. И это повод для json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1). Я также предложил способ Небезопасно, просто игнорируйте его, если хотите. Вам нужно будет найти способ, если ваша строка данных содержит u как часть исходных данных.

hygull 06.01.2019 19:40
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
5
91
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Строка 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, но, поскольку вы не контролируете создание объекта, вы не можете быть уверены, что он не был создан злоумышленником, чтобы нанести ущерб вашей системе.

Другие вопросы по теме