2013-02-08 95 views
9

我一直在试图找出如何加载在Python JSON对象。Python的json.loads不起作用

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 

我在哪里出错了?

错误代码(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); 

真正的代码(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)); 

真正的代码(蟒蛇):

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

回答

8

你的JSON数据被封闭在额外的引号使其成为一个JSON字符串,包含在该字符串中的数据是 JSON。

打印repr(decData)相反,你会得到:

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

和JSON库正确解释是作为一个字符串与文字内容{'name' : 'journal2'}。如果剥离了外部引号,则包含的字符不是有效的JSON,因为JSON字符串必须始终用双引号引起来。

对于所有json模块而言,decData也可以同样已经包含"This is not JSON"postData将被设置为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) 

修复无论是产生这个字符串,你的看法是好的,这是输入被打破。

2

要解决错误“需要用双引号括属性名称”你可以这样做:

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

这是不对的,'的eval(数据)'可能会得到正确的结果 – WeizhongTu 2015-11-24 04:38:25

+1

这是真实的,但你不应该使用eval()我认为这是使用JSON模块的想法。使用eval被认为是不好的做法,我这是它http://stackoverflow.com/a/1832957/2289246 – 2016-08-18 11:18:00

-2

你也可以去eval

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

它的工作原理,并返回你的字典。

+1

从接受的答案来看一个有趣的答案,你开始在错误点(你需要'数据='''“{'name':'journal2'}”''''准确地表示OP给出的内容),这可能意味着'eval'不太有用。 – 2017-02-20 07:42:54