如果string有一个"\ r"即回车符,Python中的json.loads(jsonstring)就会失败

Opt*_*mus 3 python parsing json

我得到一个JSON字符串,其中有一个"\r"字符,例如"{"data":"foo \r\n bar"}"当我尝试解析它时抛出ValueError.

>>> j="""{"data":"foo \r\n bar"}"""
>>> import json
>>> f=json.loads(j)

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    f=json.loads(j)
  File "C:\Python27\lib\json\__init__.py", line 326, in loads
    return _default_decoder.decode(s)
  File "C:\Python27\lib\json\decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Python27\lib\json\decoder.py", line 382, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Invalid control character at: line 1 column 13 (char 13)
>>> j[13]
'\r'
Run Code Online (Sandbox Code Playgroud)

"\r" 是Python字符串中完全合法的字符.

我该如何解析这个JSON字符串呢

>>> dct = somehow_parse_json(j)
>>> dct['data']
'foo \r\n bar'
Run Code Online (Sandbox Code Playgroud)

我可以很容易地找到并弹出回车符,但我更喜欢它们可以保存.

DrT*_*rsa 5

你应该在JSON中转义斜杠:

j="""{"data":"foo \\r\\n bar"}"""
Run Code Online (Sandbox Code Playgroud)

如果您没有转义它们,那么您的JSON无效(是有效的Python字符串).

  • 原始字符串会使其更容易阅读,另外:`j = r"""{"data":"foo\r \n bar"}""" (4认同)
  • @Optimus:`r"""......""``字符串在`r`之前只有一个斜杠,即`\ r \n`.再看我的评论.我发布的"r"""......"""字符串只是写出DrTyrsa发布的不同方式,两者之间的唯一区别在于人类读者. (2认同)