Python читать многострочный JSON - PullRequest
13 голосов
/ 26 мая 2010

Я пытался использовать JSON для хранения настроек программы. Я не могу заставить JSON-декодер Python 2.6 декодировать многострочные JSON-строки ...

Вот пример ввода:

.settings file:
"""
{\
  'user':'username',\
  'password':'passwd',\
}\
"""

Я испробовал несколько других синтаксисов для этого файла, которые я укажу ниже (с отслеживанием, которое они вызывают).

Мой код Python для чтения файла в

import json
settings_text = open(".settings", "r").read()
settings = json.loads(settings_text)

Трассировка для этого:

Traceback (most recent call last):
  File "json_test.py", line 4, in <module>
    print json.loads(text)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/json/__init__.py", line 307, in loads
    return _default_decoder.decode(s)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/json/decoder.py", line 322, in decode
    raise ValueError(errmsg("Extra data", s, end, len(s)))
ValueError: Extra data: line 1 column 2 - line 7 column 1 (char 2 - 41)

Я предполагаю, что "Дополнительные данные" - это тройная кавычка.

Вот другие синтаксисы, которые я пробовал для файла .settings, с соответствующими им трассировками:

"{\
  'user':'username',\
  'pass':'passwd'\
}"

Traceback (most recent call last):
  File "json_test.py", line 4, in <module>
    print json.loads(text)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/json/__init__.py", line 307, in loads
    return _default_decoder.decode(s)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/json/decoder.py", line 319, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/json/decoder.py", line 336, in raw_decode
    obj, end = self._scanner.iterscan(s, **kw).next()
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/json/scanner.py", line 55, in iterscan
    rval, next_pos = action(m, context)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/json/decoder.py", line 155, in JSONString
    return scanstring(match.string, match.end(), encoding, strict)
ValueError: Invalid \escape: line 1 column 2 (char 2)



'{\
  "user":"username",\
  "pass":"passwd",\
}'

Traceback (most recent call last):
  File "json_test.py", line 4, in <module>
    print json.loads(text)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/json/__init__.py", line 307, in loads
    return _default_decoder.decode(s)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/json/decoder.py", line 319, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/json/decoder.py", line 338, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

Если поместить все настройки в одну строку, они прекрасно декодируются.

Ответы [ 3 ]

20 голосов
/ 26 мая 2010

Избавьтесь от всех обратных слешей и всех цитат «Pythonic» в файле настроек. Работает нормально, если файл просто:

{
  "user":"username",
  "password":"passwd"
}

Обратите внимание, что строки JSON заключаются в двойные, а не в одинарные кавычки. Смотрите спецификацию JSON здесь:

http://www.json.org/

2 голосов
/ 26 мая 2010
>>> s = """
{
  "user":"username",
  "password":"passwd"
}
"""
>>> json.loads(s)
{'password': 'passwd', 'user': 'username'}

json не считает \ символом продолжения строки.

0 голосов
/ 05 января 2013

Попробуйте использовать eval (s)

з = ""» {\ 'Пользователь': 'имя пользователь', \ 'Пароль': 'ПАРОЛЬ', \ \ "" "

сс = Eval (д)

кв.кв {'password': 'passwd', 'user': 'username'}

тип (кв.кв) ДИКТ

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