Правильный способ работы со строкой, которая выглядит как объект json, но она заключена в одинарные кавычки - PullRequest
4 голосов
/ 01 июля 2011

По определению строка JSON заключена в двойные кавычки.

На самом деле:

json.loads('{"v":1}') #works

json.loads("{'v':1}") #doesn't work

Но как поступить со вторыми утверждениями? Я ищу решение, отличное от Eval или заменить. Спасибо.

Ответы [ 4 ]

2 голосов
/ 01 июля 2011

Если вы не можете исправить другую сторону, вам придется преобразовать неверный JSON в действительный JSON.Я думаю, что следующее правильно обрабатывает экранированные символы:

def fixEscapes(value):
  # Replace \' by '
  value = re.sub(r"[^\\]|\\.", lambda match: "'" if match.group(0) == "\\'" else match.group(0), value)
  # Replace " by \"
  value = re.sub(r"[^\\]|\\.", lambda match: '\\"' if match.group(0) == '"' else match.group(0), value)
  return value

input = "{'vt\"e\\'st':1}"
input = re.sub(r"'(([^\\']|\\.)+)'", lambda match: '"%s"' % fixEscapes(match.group(1)), input)
print json.loads(input)
2 голосов
/ 01 июля 2011

Если вы получаете json, сформированный по почте, почему бы вам просто не заменить двойные кавычки одинарными кавычками до

json.load
1 голос
/ 01 июля 2011

Не уверен, правильно ли я понял ваши требования, но вы ищете что-то подобное?

def fix_json(string_):
    if string_[0] == string_[-1] == "'":
        return '"' + string_[1:-1] +'"'
    return string_

Пример использования:

>>> fix_json("'{'key':'val\"'...cd'}'")
"{'key':'val"'...cd'}"

РЕДАКТИРОВАТЬ: кажется, что юмор, который я пытался сделать в приведенном выше примере, не говорит само за себя. Итак, вот еще один пример:

>>> fix_json("'This string has - I'm sure -  single quotes delimiters.'")
"This string has - I'm sure -  single quotes delimiters."

Этот пример показывает, как «замена» происходит только на концах строки, а не внутри нее.

Конечно, вы можете добиться того же с помощью регулярного выражения, но если вы просто проверяете начальный и конечный символы строки, я считаю, что использование регулярных строковых индексов более читабельно ...

0 голосов
/ 11 января 2012

к сожалению вы должны сделать это:

f = open('filename.json', 'rb')

json = eval(f.read())

сделано!

это работает, но, очевидно, людям не нравится функция evalДайте мне знать, если вы найдете лучший подход.Я использовал это в некоторых данных твиттера ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...