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 としてインポートされますここに画像の説明を入力

ここに画像の説明を入力

これは私のアイデアが示すものです

コンマが誤って追加されただけです。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 によって解釈され、通常の"が挿入されます。それ以外の場合は、バックスラッシュを 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)

\"シーケンスが として出力され"、バックスラッシュがなくなったことに注意してください!

于 2015-10-01T17:44:49.570 に答える
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 で終了しました

于 2015-10-01T17:48:11.363 に答える