Как оказалось, : mod: json также захлебывается строками в одинарных кавычках. Это все уладит, хотя:
Разобрать объект JavaScript как JSON в python:
Решение:
>>> from re import sub
>>> import json
>>> js = "{ a: 'a' }"
>>> json.loads(sub("'", '"', sub('\s(\w+):', r' "\1":', js)))
{u'a': u'a'}
Редактировать: (обзор крайних случаев)
Таким образом, было выдвинуто предположение, что предлагаемое решение не справится со всеми случаями и, в частности, с чем-то вроде
например. {foo: "предложение: прямо здесь!"} будет изменено на {"foo": "a" предложение ": прямо здесь!"}
- Джейсон С. 12 апреля в 18: 03
Чтобы решить эту проблему, нам просто нужно убедиться, что мы на самом деле работаем с ключом, а не просто с двоеточием в строке, поэтому мы немного заглянем за магию, чтобы намекнуть на запятую (,) или фигурную скобку ({ ) наличие, чтобы убедиться, что это правильно, например:
двоеточие в строке:
>>> js = "{foo: 'a sentence: right here!'}"
>>> json.loads(sub("'", '"', sub('(?<={|,)\s*(\w+):', r' "\1":', js)))
{u'foo': u'a sentence: right here!'}
Что, конечно, то же самое, что и делать:
>>> js = "{foo: 'a sentence: right here!'}"
>>> json.loads(sub('(?<={|,)\s*(\w+):', r' "\1":', js).replace("'",'"'))
{u'foo': u'a sentence: right here!'}
Но потом я указал, что это не единственный недостаток, потому что насчет цитат:
Если нас также волнуют экранированные кавычки, нам нужно будет немного конкретнее определить, что представляет собой строка. Первая кавычка будет следовать либо за фигурной скобкой ({), либо за пробелом (\ s), либо за двоеточием (:), а последняя соответствующая кавычка будет стоять перед запятой (,) или закрывающей фигурной скобкой (}), тогда мы можем рассмотреть все между ними как часть одной строки, например так:
дополнительные кавычки в строке:
>>> js = "{foo: 'a sentence: it\'s right here!'}"
>>> json.loads(
... sub("(?<=\s|{|:)'(.*?)'(?=,|})",
... r'"\1"',
... sub('(?<={|,)\s*(\w+):', r' "\1":', js))
... )
{u'foo': u"a sentence: it's right here!"}
Наблюдайте за этим пространством, так как больше крайних случаев выявлено и раскрыто. Можете ли вы найти другой?
Или, может быть, для чего-то более сложного, примера из реального мира, возвращаемого npm view
:
От:
Кому:
у меня работает =)
NJoy!