2013-02-08 28 views
9

Tôi đã cố gắng tìm ra cách tải các đối tượng JSON bằng Python.Python json.loads không hoạt động

def do_POST(self): 
    length = int(self.headers['Content-Length']) 
    decData = str(self.rfile.read(length)) 
    print decData, type(decData) 
    "{'name' : 'journal2'}" <type 'str'> 
    postData = json.loads(decData) 
    print postData, type(postData) 
    #{'name' : 'journal2'} <type 'unicode'> 
    postData = json.loads(postData) 
    print postData, type(postData) 
    # Error: Expecting property name enclosed in double quotes 

Tôi sẽ làm gì sai?

Error Code (JScript):

var data = "{'name':'journal2'}"; 
var http_request = new XMLHttpRequest(); 
http_request.open("post", url, true); 
http_request.setRequestHeader('Content-Type', 'application/json'); 
http_request.send(data); 

Đúng Mã (JScript):

var data = '{"name":"journal2"}'; 
var http_request = new XMLHttpRequest(); 
http_request.open("post", url, true); 
http_request.setRequestHeader('Content-Type', 'application/json'); 
http_request.send(JSON.stringify(data)); 

Đúng Mã (Python):

def do_POST(self): 
    length = int(self.headers['Content-Length']) 
    decData = self.rfile.read(length) 
    postData = json.loads(decData) 
    postData = json.loads(postData) 

Trả lời

8

Dữ liệu JSON của bạn được bao gồm trong các dấu ngoặc kép làm cho nó thành chuỗi JSON, dữ liệu chứa trong chuỗi đó là không phải là JSON.

In repr(decData) thay vào đó, bạn sẽ nhận được:

'"{\'name\' : \'journal2\'}"' 

và thư viện JSON được một cách chính xác giải thích rằng khi một chuỗi với những nội dung đen {'name' : 'journal2'}. Nếu bạn loại bỏ các dấu ngoặc kép bên ngoài, các ký tự chứa không phải là JSON hợp lệ, bởi vì các chuỗi JSON phải luôn được đặt trong dấu ngoặc kép.

Đối với tất cả các mô-đun json là có liên quan, decData có thể cũng giống như cũng đã chứa "This is not JSON"postData sẽ được thiết lập để u'This is not JSON'.

>>> import json 
>>> decData = '''"{'name' : 'journal2'}"''' 
>>> json.loads(decData) 
u"{'name' : 'journal2'}" 
>>> json.loads(json.loads(decData)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 326, in loads 
    return _default_decoder.decode(s) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 366, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 382, in raw_decode 
    obj, end = self.scan_once(s, idx) 
ValueError: Expecting property name: line 1 column 1 (char 1) 

Khắc phục mọi thứ đang tạo chuỗi này, chế độ xem của bạn tốt, đó là đầu vào bị hỏng.

2

Để workaround lỗi 'Mong tên thuộc tính kèm theo trong dấu ngoặc kép' bạn có thể làm:

import json 
data = "{'name' : 'journal2'}" 
json.loads(json.dumps(data)) 
+4

điều này không đúng, 'eval (dữ liệu)' có thể nhận được kết quả đúng – WeizhongTu

+1

Đó là sự thật nhưng bạn không nên sử dụng eval() Tôi nghĩ đó là ý tưởng sử dụng mô-đun json. Sử dụng eval được coi là một thực tế xấu, tôi đây là một câu trả lời thú vị về nó http://stackoverflow.com/a/1832957/2289246 –

-2

Bạn cũng có thể đi với eval:

data = "{'name' : 'test'}" 
eval(data) 

Nó hoạt động và trả về cho bạn một dict.

+1

Đánh giá từ câu trả lời được chấp nhận, bạn đang bắt đầu tại điểm sai (bạn sẽ cần 'dữ liệu = '' '"{' name ':' journal2 '}"' '' 'để biểu diễn chính xác OP được đưa ra), có nghĩa là' eval' ít hữu ích hơn. –

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