3

次のPHPコードがあります。

    $foo = new stdClass();
    $foo->test='hello world';
    $bar = new stdClass();
    $bar->foo = json_encode($foo);
    $encoded_string = json_encode($bar);

含まれる$encoded_stringもの:

{"foo":"{\"test\":\"hello world\"}"}

この文字列を JavaScript から解析したい ($.parseJSONたとえば、jQuery を使用):

var data = $.parseJSON('{"foo":"{\"test\":\"hello world\"}"}');
console.log(data);

次のようなものがログに記録されることを期待しています。

Object {foo: '{"test":"hello world"}'}

しかしUnexpected token t、実行するとエラーが発生します(クロムを使用)

Javascriptでこのjson文字列を解析するにはどうすればよいですか? 誰かが試してみたい場合は、ここにフィドルがあります。

4

5 に答える 5

5

あなたが直面している問題は、出力がjson_encodeJavaScriptで文字列として直接使用されることを意図していないことです。

json_encode使用可能な JavaScript オブジェクトを出力します。

<?php
$foo = new stdClass();
$foo->test='hello world';
$bar = new stdClass();
$bar->foo = json_encode($foo);
$encoded_string = json_encode($bar);
?>
var a = <?php $encoded_string ?>;
console.log(a.foo); // produces '{"test":"hello world"}'

文字列値から不必要に JSON 出力を解析したい場合は、単純に二重エンコードする必要があり$encoded_stringます。

<?php
$foo = new stdClass();
$foo->test='hello world';
$bar = new stdClass();
$bar->foo = json_encode($foo);
$encoded_string = json_encode(json_encode($bar));
?>
var aStr = <?php $encoded_string ?>;
var a = JSON.parse(aStr);
console.log(a.foo); //same as before

もちろん、サーバー側言語を使用して JavaScript コードを生成することは避け、代わりにデータをdata-*属性として、または AJAX で要求できる JSON ソースとして設定する必要があります。

データがサーバー (または属性) から要求されると、適切にエスケープされた JavaScript 文字列になります。これはJSON.parse、オブジェクトを解析するために必要な場所です。

于 2013-06-18T21:21:33.970 に答える
2

あなたのコードは

$foo = new stdClass();
$foo->test='hello world';
$bar = new stdClass();
$bar->foo = $foo;
$encoded_string = json_encode($bar);

最後に1回jsonエンコードし、反対側の最初に1回デコードするだけです。


jsfiddleに関しては、文字列リテラルが「javascriptメモリ内の文字列」になる前に追加のデコードレイヤーを通過することを考慮していません。

この場合、文字列リテラルをセットアップする正しい方法は (JS-JSON-JSON) です。

data = $.parseJSON('{"foo":"{\\\"test\\\":\\\"hello world\\\"}"}');
console.log($.parseJSON(data.foo));

そして、行ったエンコード手順を逆にするだけで機能します。http://jsfiddle.net/Jmjjp/2/

于 2013-06-18T21:20:10.090 に答える
1

問題は、JSON としての二重エンコードです。データを文字列として保持する必要がある場合の解決策は

$bar->foo = addslashes(json_encode($foo));

于 2013-06-18T21:10:35.040 に答える
0

コードは、返すべきものを正確に返します。

json_encodein $bar の場合、$bar->foo は文字列です。この文字列は、正しい出力を生成するためにエスケープされます。

$bar->foo = json_encode($foo);

する必要があります$bar->foo = $foo

于 2013-06-18T20:55:25.490 に答える