11

我一直在试图弄清楚如何在 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)
4

3 回答 3

9

您的 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)

修复产生这个字符串的任何东西,你的视图很好,它是被破坏的输入。

于 2013-02-08T11:31:09.860 回答
3

要解决错误“期望用双引号括起来的属性名称”,您可以执行以下操作:

import json
data = "{'name' : 'journal2'}"
json.loads(json.dumps(data))
于 2015-08-17T10:06:48.267 回答
-2

您也可以使用eval

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

它可以工作并返回一个字典。

于 2017-02-20T07:36:26.950 回答