Python打破了用字符解析json \"

时间:2015-10-01 17:37:46

标签: python json parsing ujson

我试图使用转义字符解析json字符串(我估计某种情况)

{
    "publisher": "\"O'Reilly Media, Inc.\""
}

如果我从字符串

中删除字符\",则解析器会很好地解析

不同解析器引发的异常是,

JSON

  File "/usr/lib/python2.7/json/__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python2.7/json/decoder.py", line 382, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Expecting , delimiter: line 17 column 20 (char 392)

ujson

ValueError: Unexpected character in found when decoding object value

如何让解析器转义这个字符?

更新: enter image description here PS。在这个例子中,json作为ujson导入

enter image description here

这就是我的想法

comma只是意外添加,它在json结尾没有尾随逗号,json有效

enter image description here

字符串定义。

2 个答案:

答案 0 :(得分:9)

你几乎肯定没有定义正确的转义反斜杠。如果你正确定义了字符串,JSON就会解析就好了

>>> import json
>>> json_str = r'''
... {
...     "publisher": "\"O'Reilly Media, Inc.\""
... }
... '''  # raw string to prevent the \" from being interpreted by Python
>>> json.loads(json_str)
{u'publisher': u'"O\'Reilly Media, Inc."'}

请注意,我使用原始字符串文字在Python中定义字符串;如果我没有,\"将由Python解释,并且将插入常规"。你必须加倍反斜杠:

>>> print '\"'
"
>>> print '\\"'
\"
>>> print r'\"'
\"

将解析后的Python结构重新编码回JSON会显示反斜杠重新出现,并使用相同的双反斜杠为字符串输出repr()

>>> json.dumps(json.loads(json_str))
'{"publisher": "\\"O\'Reilly Media, Inc.\\""}'
>>> print json.dumps(json.loads(json_str))
{"publisher": "\"O'Reilly Media, Inc.\""}

如果你没有逃脱\逃脱,你最终会得到未转义的引号:

>>> json_str_improper = '''
... {
...     "publisher": "\"O'Reilly Media, Inc.\""
... }
... '''
>>> print json_str_improper

{
    "publisher": ""O'Reilly Media, Inc.""
}

>>> json.loads(json_str_improper)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/json/__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/json/decoder.py", line 382, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Expecting , delimiter: line 3 column 20 (char 22)

请注意,\"序列现在打印为",反斜杠消失了!

答案 1 :(得分:2)

您的JSON无效。如果您对JSON对象有疑问,可以随时使用JSONlint对其进行验证。在你的情况下你有一个对象

{
"publisher": "\"O'Reilly Media, Inc.\"",
}

你还有一个额外的逗号,表示还有其他东西要来了。所以JSONlint产生

  

第2行的解析错误:   ... edia,Inc。\“”,}   --------------------- ^   期待'STRING'

可以帮助您找到错误的位置。

删除

的逗号
{
"publisher": "\"O'Reilly Media, Inc.\""
}

产量

  

有效JSON

更新:我将这些内容保留在JSONlint中,因为它可能对将来的其他人有所帮助。至于你结构良好的JSON对象,我有

import json

d = {
    "publisher": "\"O'Reilly Media, Inc.\""
    }

print "Here is your string parsed."
print(json.dumps(d))

产生

  

这是你解析的字符串。   {“publisher”:“\”O'Reilly Media,Inc。\“”}

     

处理完成,退出代码为0