Python читает многострочный JSON
Я пытаюсь использовать JSON для хранения настроек для программы. Я не могу заставить Python 2.6 JSON Decoder декодировать многострочные строки 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 с их соответствующими Tracebacks:
"{\
'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
Если я поместил все настройки в одну строку, он декодирует штраф.
Ответы
Ответ 1
Избавьтесь от всех обратных косых черт и всех "Pythonic", котирующих в файле настроек. Отлично работает, если файл просто:
{
"user":"username",
"password":"passwd"
}
Заметим также, что строки JSON цитируются с двойными кавычками, а не одинарные кавычки. См. Здесь спецификацию JSON:
http://www.json.org/
Ответ 2
>>> s = """
{
"user":"username",
"password":"passwd"
}
"""
>>> json.loads(s)
{'password': 'passwd', 'user': 'username'}
json не считает \
символом продолжения строки.
Ответ 3
Попробуйте использовать eval (s)
s = "" {\ 'Пользователь': 'имя пользователь', \ 'Пароль': 'ПАРОЛЬ', \ \ ""
сс = Eval (д)
кв.кв {'password': 'passwd', 'user': 'username'}
тип (кв.кв) ДИКТ