Python的json.loads无法工作

13

我一直在尝试弄清楚如何在Python中加载JSON对象。

   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));

真正的代码(Python):

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

11
你的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)

修复产生这个字符串的任何问题,您的视图没问题,输入存在问题。


5
为了解决“期望双引号括起来的属性名”错误,您可以这样做:
import json
data = "{'name' : 'journal2'}"
json.loads(json.dumps(data))

6
这不正确,eval(data) 可能会得到正确的结果。 - WeizhongTu
1
没错,但是你不应该使用eval(),我认为使用json模块就是为了避免这种情况。使用eval被认为是一种不好的做法,这里有一个关于它的有趣回答:https://dev59.com/dXI-5IYBdhLWcg3weoTR#1832957 - J.Serra

-3

您也可以使用 eval

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

它能够正常工作并返回一个字典。


1
从被接受的答案来看,你的起点是错误的(你需要 data = '''"{'name' : 'journal2'}"''' 来准确地表示 OP 给出的内容),这可能意味着 eval 不太有用。 - Jonathan Leffler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接