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

时间:2011-11-30 10:06:17

标签: python json parsing

我正在获取一个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'

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

如何解析此JSON字符串,例如

>>> dct = somehow_parse_json(j)
>>> dct['data']
'foo \r\n bar'

我可以轻松找到并弹出回车符,但我更愿意保存它们。

2 个答案:

答案 0 :(得分:5)

你应该在JSON中转义斜杠:

j="""{"data":"foo \\r\\n bar"}"""

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

答案 1 :(得分:1)

逻辑上python正在做本应该做的事情!

它的老CRLF(灵感来自打字机) CR = Carraige Return LF =换行

'\ r'代表CR 但'\ n'= CR + LF 所以,我的观点是json它绝对无效。

对于Eg:     打印'\ n 123456 \ rone'     #one3456

现在,如何使用\r

# if j is your json
j = j.replace('\r','\\r')

只应使用\r

转义\\r