ホームページ >バックエンド開発 >PHPチュートリアル >「json_encode」でバックスラッシュが追加されるのはなぜですか?それを防ぐにはどうすればよいですか?

「json_encode」でバックスラッシュが追加されるのはなぜですか?それを防ぐにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-12 04:36:01362ブラウズ

Why does `json_encode` add backslashes and how can I prevent it?

Json_encode にバックスラッシュが追加: 謎の解明

JavaScript の領域では、json_encode はデータを JSON 形式にエンコードするための信頼できる味方であり続けています。 。ただし、一部の開発者は、json_encode が出力にバックスラッシュを導入するという予期せぬ現象に遭遇しました。

アップロードの難題

このようなインスタンスの 1 つは、json_encode を使用して JSON データを返すときに発生します。ファイルのアップロード。次のコードを考えてみましょう:

print_r($result); // Associative array

$encoded_result = json_encode($result); // Valid JSON

echo $encoded_result;

説明されていないバックスラッシュ

開発者が驚いたことに、結果の JSON には不要なバックスラッシュが含まれています:

{"logo_url":"http:\/\/mysite.com\/uploads\/gallery\/7f\/3b\/f65ab8165d_logo.jpeg","img_id":"54","feedback":{"message":"File uploaded","success":true}}

犯人の特定

初期調査により、json_encode とブラウザによる JSON データ解析の間のどこかにバックスラッシュが追加されていることが判明しました。

alert(data.toSource()); // Result: invalid JSON with added "status:200"

隠し変数

詳しく調べると、予期せぬ原因である Plupload バインド イベントが判明しました。

uploader.bind('FileUploaded', function(up, file, data) {
  alert(data.toSource());
  $('#' + file.id + " b").html("100%");
});

人気のファイル アップロード ライブラリである Plupload は、返されたデータを操作しているようで、 "status:200" プロパティとスラッシュのエンコード。

解決策: スラッシュのエスケープ

不要なバックスラッシュを阻止するために、コードは " を含むように変更されました。 json_encode 関数呼び出しの JSON_UNESCAPED_SLASHES" オプション:

$encoded_result = json_encode($result, JSON_UNESCAPED_SLASHES);

このオプションはスラッシュのエスケープを効果的に無効にし、目的の JSON 出力をもたらします:

{"logo_url":"http://mysite.com/uploads/gallery/7f/3b/f65ab8165d_logo.jpeg","img_id":"54","feedback":{"message":"File uploaded","success":true}}

真実を明らかにする

結論として、json_encode 出力にバックスラッシュが追加されたのは、Plupload バインド イベントによる意図しないデータ操作が原因でした。 「JSON_UNESCAPED_SLASHES」オプションを組み込むことで、開発者はこの不要なエスケープ文字が JSON データに干渉するのを防ぐことができます。

以上が「json_encode」でバックスラッシュが追加されるのはなぜですか?それを防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。