Мой код:
import simplejson as json
s = "{'username':'dfdsfdsf'}" #1
#s = '{"username":"dfdsfdsf"}' #2
j = json.loads(s)
#1
определение неверно
#2
определение правильное
Я слышал, что в Python одинарные и двойные кавычки могут быть взаимозаменяемыми. Кто-нибудь может мне это объяснить?
str(dict)
и не хочуeval
этого. Простой.replace("'", '"')
должен сделать свое дело.json.dumps(..)
дважды вызвать, как в:,import json; d = dict(tags=["dog", "cat", "mouse"]); print json.dumps(json.dumps(d))
что дает:"{\"tags\": [\"dog\", \"cat\", \"mouse\"]}"
ты можешь использовать
ast.literal_eval()
источник
{ 'a' : 'this "string" really isn\'t!!!!' }
"{'link':'<a href="mylink">http://my.com</a>'}"
? В этом случаеast.literal_eval
выдает синтаксическую ошибкуВы можете сбросить JSON с двойной кавычкой:
источник
demjson также является хорошим пакетом для решения проблемы плохого синтаксиса json:
Использование:
Редактировать:
источник
demjson.decode
- отличный инструмент для поврежденного json, но для задач, включающих десятки или сотни тысяч json-пакетов,ast.literal_eval
он намного быстрее. Не сказатьdemjson
, что в нем нет места: я использую его как запасной вариант на случай, если более быстрые методы не работают.На данный момент даны две проблемы с ответами, если, например, один передает такой нестандартный JSON. Потому что тогда, возможно, придется интерпретировать входящую строку (а не словарь Python).
Проблема 1 -
demjson
: с Python 3.7. + И использованием conda мне не удалось установить demjson, поскольку он, очевидно, в настоящее время не поддерживает Python> 3.5. Поэтому мне нужно решение с более простыми средствами, напримерast
и / илиjson.dumps
.Проблема 2 -
ast
&json.dumps
: если JSON заключен в одинарные кавычки и содержит строку как минимум в одном значении, которое, в свою очередь, содержит одинарные кавычки, единственное простое, но практическое решение, которое я нашел, - это применение обоих:В следующем примере мы предполагаем,
line
что это входящий строковый объект JSON:Шаг 1: преобразуйте входящую строку в словарь, используя
ast.literal_eval()
Шаг 2: примените
json.dumps
к нему для надежного преобразования ключей и значений, но не затрагивая содержимое значений :json.dumps
сам по себе не справился бы с этой задачей, потому что он не интерпретирует JSON, а только видит строку. Аналогичноast.literal_eval()
: хотя он правильно интерпретирует JSON (словарь), он не преобразует то, что нам нужно.источник
Вы можете исправить это так:
источник
Как уже говорилось, JSON - это не синтаксис Python. В JSON нужно использовать двойные кавычки. Его создатель (не) известен тем, что использует строгие подмножества допустимого синтаксиса для облегчения когнитивной перегрузки программиста.
Ниже может произойти сбой, если одна из строк JSON сама по себе содержит одну кавычку, как указано @Jiaaro. НЕ ИСПОЛЬЗУЙ. Оставил здесь как пример того, что не работает.
Это действительно полезно знать , что нет одинарных кавычек в строке JSON. Скажем, вы скопировали и вставили его из консоли браузера / чего угодно. Затем вы можете просто ввести
В противном случае это могло бы сломаться, если бы также использовались одинарные кавычки.
источник
{"key": "value 'with' single quotes"}
Это действительно решило мою проблему с помощью функции eval.
источник
Недавно я столкнулся с очень похожей проблемой и считаю, что мое решение сработает и для вас. У меня был текстовый файл, содержащий список элементов в форме:
Я хотел разобрать приведенное выше в список Python, но мне не нравился eval (), так как я не мог доверять входным данным. Сначала я попробовал использовать JSON, но он принимает только элементы в двойных кавычках, поэтому я написал свой собственный очень простой лексер для этого конкретного случая (просто вставьте свой собственный "stringtoparse", и вы получите в виде списка вывода: 'items')
Надеюсь, это кому-нибудь пригодится. Наслаждайтесь!
источник
Работает для меня
источник
Приведенный выше фрагмент кода должен работать.
источник