2010-05-26 45 views
13

Tôi đã cố gắng sử dụng JSON để lưu trữ cài đặt cho một chương trình. Tôi dường như không thể có được Python 2.6 's JSON Decoder để giải mã nhiều dòng JSON chuỗi ...Đọc Python đa dòng JSON

Dưới đây là ví dụ đầu vào:

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

Tôi đã thử một vài cú pháp khác cho tập tin này, mà tôi sẽ chỉ định bên dưới (với traceback họ gây ra).

mã python của tôi để đọc các tập tin trong là

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

Các Traceback cho điều này là:

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) 

Tôi giả sử "Extra dữ liệu" là ba báo giá.

Sau đây là các cú pháp khác tôi đã cố gắng cho các tập tin .settings, với ngược giòng trở lại của mình:

"{\ 
    '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 

Nếu tôi đặt các thiết lập trên cùng một dòng, nó giải mã tốt.

Trả lời

20

Loại bỏ tất cả các dấu gạch chéo ngược và tất cả trích dẫn "Pythonic" trong tệp cài đặt. Hoạt động tốt nếu tệp chỉ là:

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

Cũng lưu ý rằng chuỗi JSON được trích dẫn với dấu ngoặc kép, không phải dấu nháy đơn. Xem JSON đặc tả ở đây:

http://www.json.org/

2
>>> s = """ 
{ 
    "user":"username", 
    "password":"passwd" 
} 
""" 
>>> json.loads(s) 
{'password': 'passwd', 'user': 'username'} 

json không xem xét \ trở thành một nhân vật tiếp tục dòng.

+0

này không làm việc khi bạn tạo các chuỗi trong thông dịch viên, nhưng nó không hoạt động khi đọc từ một tập tin. –

+1

@Paul: vì nội dung tệp của bạn không chính xác! – SilentGhost

-5

Cố gắng sử dụng eval (s)

s = """ {\ 'sử dụng': 'username', \ 'mật khẩu': 'passwd', \ \ "" "

ss = eval (q)

qq { 'mật khẩu': 'passwd', 'user': 'username'}

loại (qq) dict

+5

Vui lòng không sử dụng eval - http://stackoverflow.com/questions/661084/security-of-pythons-eval-on-untrusted-strings/661128#661128 –

Các vấn đề liên quan