5

PHP で作成された JSON オブジェクトがあります。その JSON オブジェクトには、セルの 1 つに別のエスケープされた JSON 文字列が含まれています。

php > $insidejson = array('foo' => 'bar','foo1' => 'bar1');
php > $arr = array('a' => array('a1'=>json_encode($insidejson)));
php > echo json_encode($arr);
{"a":{"a1":"{\"foo\":\"bar\",\"foo1\":\"bar1\"}"}}

次に、Python で、simplejson を使用してデコードを試みます。

>>> simplejsonをjsonとしてインポート
>>> json.loads('{"a":{"a1":"{\"foo\":\"bar\",\"foo1\":\"bar1\"}"}}')

これは次のエラーで失敗します。

トレースバック (最新の呼び出しが最後):
  ファイル ""、1 行目、?
  ファイル「build/bdist.linux-i686/egg/simplejson/__init__.py」、307 行目、読み込み中
  ファイル「build/bdist.linux-i686/egg/simplejson/decoder.py」、335行目、デコード中
  raw_decode のファイル「build/bdist.linux-i686/egg/simplejson/decoder.py」の 351 行目
ValueError: Expecting 、区切り文字: 行 1 列 14 (文字 14)

この JSON オブジェクトを Python でデコードするにはどうすればよいですか? PHP と JS の両方で正常にデコードされますが、構造を変更することはできません。これは、さまざまな言語のさまざまなコンポーネントで大きな変更が必要になるためです。

ありがとう!

4

3 に答える 3

9

文字列の前に「r」を付けて、生の文字列にします。

# Python 2.6.2
>>> import json
>>> s = r'{"a":{"a1":"{\"foo\":\"bar\",\"foo1\":\"bar1\"}"}}'
>>> json.loads(s)
{u'a': {u'a1': u'{"foo":"bar","foo1":"bar1"}'}}

以下でアレックスが言っていることは本当です: スラッシュを二重にするだけです。(彼の答えは、私が私のものを始めたときに投稿されませんでした。)同じことを意味する言語機能であり、間違いにくいという理由だけで、生の文字列を使用する方が簡単だと思います。

于 2009-08-04T23:38:45.040 に答える
1

試す

たぶん、simplejson は「単純」すぎます。

于 2009-08-04T23:19:57.107 に答える
1

バックスラッシュを文字列に挿入する場合は、バックスラッシュ自体をエスケープする必要があります。

import simplejson as json
json.loads('{"a":{"a1":"{\\"foo\\":\\"bar\\",\\"foo1\\":\\"bar1\\"}"}}')

私はそれをテストしましたが、Python はその入力を問題なく処理します。ただし、標準ライブラリ ( import json、Python 3.1) に含まれている json モジュールを使用しました。

于 2009-08-04T23:35:09.073 に答える