適切にエスケープされたバックスラッシュを定義していないことはほぼ確実です。文字列を適切に定義すると、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 によって解釈され、通常の"
が挿入されます。それ以外の場合は、バックスラッシュを 2 倍にする必要があります。
>>> 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)
\"
シーケンスが として出力され"
、バックスラッシュがなくなったことに注意してください!