60

ずっと使っていjson_encodeて、今のところ問題ありません。現在、アップロードスクリプトを使用しており、ファイルのアップロード後にJSONデータを返そうとしています。

私は次のコードを持っています:

print_r($result); // <-- This is an associative array
echo json_encode($result); // <-- this returns valid JSON

これにより、次の結果が得られます。

// print_r result
Array
(
    [logo_url] => http://mysite.com/uploads/gallery/7f/3b/f65ab8165d_logo.jpeg
    [img_id] => 54
    [feedback] => Array
        (
            [message] => File uploaded
            [success] => 1
        )

)

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

json_encodeスラッシュを追加する理由を誰かに教えてもらえますか?

アップデート

@Quentinは、との間で何かが起こっていると言ったjson_encode.parseJSONそして彼は正しい。

aalert(data.toSource());を実行すると、次のような結果が得られます。

({response:"{\"logo_url\":\"http:\\/\\/storelocator.com\\/wp-content\\/uploads\\/gallery\\/7f\\/3b\\/71b9520cfc91a90afbdbbfc9d2b2239b_logo.jpeg\",\"img_id\":\"62\",\"feedback\":{\"message\":\"File uploaded\",\"success\":true}}", status:200})

そして、これは有効なJSONではありません。また、を追加し、status:200これがどこから来ているのかわかりません。

Plupload bind返されたデータに何か影響があるのでしょうか?

これは私のjsスクリプトです:

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

7 に答える 7

94

「JSON_UNESCAPED_SLASHES」オプション(バージョン5.4以降に追加)を使用するだけです。

json_encode($array,JSON_UNESCAPED_SLASHES);
于 2016-07-06T17:01:30.753 に答える
40

一部のスクリプトでもこの問題が発生しましたが、これもjsonでエンコードされた別の配列にラップされた配列にjson_encodeを適用していたために発生したようです。データを作成するスクリプトに複数のforeachループがある場合は、簡単に実行できます。常に最後にjson_encodeを適用します。

これが起こっていたことです。もし、するなら:

$data[] = json_encode(['test' => 'one', 'test' => '2']);
$data[] = json_encode(['test' => 'two', 'test' => 'four']);
echo json_encode($data);

結果は次のとおりです。

["{\"test\":\"2\"}","{\"test\":\"four\"}"]

したがって、実際に行う必要があるのは次のとおりです。

$data[] = ['test' => 'one', 'test' => '2'];
$data[] = ['test' => 'two', 'test' => 'four'];
echo json_encode($data);

そしてこれは戻ります

[{"test":"2"},{"test":"four"}]
于 2014-08-11T14:26:32.907 に答える
38

json_encodeがスラッシュを追加する理由を誰かに教えてもらえますか?

スラッシュ文字を前に<付けると、HTMLスクリプト要素に埋め込まれたときに問題が発生する可能性があります(「スクリプト要素の終わり」のSGMLルールがトリガーされます)。それらは予防措置として逃げられます。

私がしようとすると、jQuery.parseJSON(response);を使用するからです。私のjsスクリプトでは、nullを返します。だから私の推測では、それはスラッシュと関係があります。

そうではありません。JSONでは"/""\/"同等です。

質問にリストしたJSONは有効です( jsonlintでテストできます)。あなたの問題は、との間で何が起こっているかに関係している可能性がjson_encodeありparseJSONます。

于 2012-04-25T11:34:41.910 に答える
3

これは、JSON形式が ""(引用符)を使用し、これらの引用符の間にあるものはすべて有用な情報(キーまたはデータ)であるために発生します。

データが次のようになっているとします。He said "This is how it is done". 実際のデータは次のようになります"He said \"This is how it is done\"."

これにより、がJSONフォーマット\"としてではなくとして扱われるようになります。"(Quotation mark)これはと呼ばれescape characterます。

これは通常、すでにJSONでエンコードされたデータをエンコードしようとしたときに発生します。これは、私がこれを確認した一般的な方法です。

これを試して

$arr = ['This is a sample','This is also a "sample"']; echo json_encode($arr);

出力:

["This is a sample","This is also a \"sample\""]
于 2016-03-16T06:34:01.420 に答える
1

phpスクリプトに正しいヘッダーがあることを確認してください。そうしないと、スラッシュヘッダーが追加されます('Content-Type:application / json');

于 2021-07-30T23:50:44.703 に答える
0

非常によく似た問題があり、アレイを投稿する準備ができていました。私の投稿機能で私はこれを持っていました:

json = JSON.stringfy(json);

ここでの詳細は、laravel内のブレードを使用して3つのビューのフォームを作成しているため、前後に移動できます。すべての戻るボタンと進むボタンの検証の間にあり、ページをリロードせずにフォームに戻ると、 jsonはバックスラッシュで埋められます。私console.log(json)はすべての検証で、jsonがオブジェクトではなく文字列として扱われていることに気づきました。

json = JSON.stringfy(json)結論として、私はそれを別の変数に割り当てたのではなく、評価するべきではありませんでした。

var aux = JSON.stringfy(json);

このようにして、文字列ではなく、オブジェクトとしてjsonを保持します。

于 2017-05-29T15:47:27.430 に答える
-2

json_encode常にスラッシュを追加します。

こちらのマニュアルでいくつかの例を確認してください

これは、エスケープする必要のある文字がある場合、問題が発生するためです。

jsonを使用するには、jsonを解析して、スラッシュが削除されていることを確認してください

スラッシュを削除するかどうかに関係なく、jsonはevalによって問題なく解析されます。

<?php
$array = array('url'=>'http://mysite.com/uploads/gallery/7f/3b/f65ab8165d_logo.jpeg','id'=>54);
?>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript">
var x = jQuery.parseJSON('<?php echo json_encode($array);?>');
alert(x);
</script>

これは私のコードであり、JSONを解析できません。

コードを確認してくださいJSONの解析中に何かが不足している可能性があります

于 2012-04-25T11:39:57.617 に答える