json.loads()仅使用原始字符串文字进行解码

时间:2013-07-02 06:28:01

标签: python json

我正在尝试执行以下代码:

str_2_load='{"source":"\u003ca href=\"http:\/\/twitter.com\" \u003eTwitter \u003c\/a\u003e"}'
json.loads(str_2_load)

收到以下错误:

  

文件“C:\ Python27 \ lib \ json \ decoder.py”,第381行,在raw_decode中       obj,end = self.scan_once(s,idx)ValueError:Expecting,delimiter:第1行第26列(char 25)

但是如果我使用原始字符串文字,它可以正常工作。 即。

str_2_load=r'{"source":"\u003ca href=\"http:\/\/twitter.com\" \u003eTwitter \u003c\/a\u003e"}'
json.loads(str_2_load)

由于str_2_load是动态分配的,我正在寻找上述问题的修复方法。

3 个答案:

答案 0 :(得分:-1)

将所有'\'替换为'\\':

>>> str_2_load='{"source":"\\u003ca href=\\"http:\\/\\/twitter.com\\" \\u003eTwitter    \\u003c\\/a\\u003e"}'
>>> json.loads(str_2_load)
{u'source': u'<a href="http://twitter.com" >Twitter </a>'}

答案 1 :(得分:-1)

Python 3 中,我遇到了同样的问题。 这是我的方法:

方法1 :按照其他人的建议,通过在字符串前面添加r'...',将字符串转换为原始字符串。正如您在下面看到的。

>>> json.loads('''{"source":"\u003ca href=\"http:\/\/twitter.com\" \u003eTwitter \u003c\/a\u003e"}''')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/__init__.py", line 354, in loads
    return _default_decoder.decode(s)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/decoder.py", line 355, in raw_decode
    obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 1 column 21 (char 20)
>>> json.loads(r'''{"source":"\u003ca href=\"http:\/\/twitter.com\" \u003eTwitter \u003c\/a\u003e"}''')
{'source': '<a href="http://twitter.com" >Twitter </a>'}

方法2 :您应该将字符串读为bytes对象,因为您的字符串包含十六进制和控制字符。自Python3.6起,json.loads()也可以处理bytes对象。

答案 2 :(得分:-1)

我相信如果您通过在字符串的开头添加“ r”来使str_2_load成为原始字符串。不知何故,这与正则表达式有关。

str_2_load=r'{"source":"\u003ca href=\"http:\/\/twitter.com\" \u003eTwitter \u003c\/a\u003e"}'
json.loads(str_2_load)

#output {'source': '<a href="http://twitter.com" >Twitter </a>'}