2

我正在尝试使用转义字符解析 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

如何使解析器转义这些字符?

更新: ps。在本例中,json 被导入为 ujson在此处输入图像描述

在此处输入图像描述

这是我的ide显示的

逗号是随便加的,json结尾没有逗号,json有效

在此处输入图像描述

字符串定义。

4

2 回答 2

10

您几乎可以肯定没有正确定义转义的反斜杠。如果您正确定义字符串,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)

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

于 2015-10-01T17:44:49.570 回答
2

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

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

并且您有一个额外的逗号,表示应该有其他东西。所以 JSONlint 产生

第 2 行的解析错误:...edia, Inc.\"", } ---------------------^ Expecting '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))

屈服

这是您解析的字符串。{"出版商": "\"O'Reilly Media, Inc.\""}

进程以退出代码 0 结束

于 2015-10-01T17:48:11.363 回答