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_encode不打算直接用作 JavaScript 中的字符串。

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);

只需 json 在末尾编码一次,在另一端开始解码一次。


至于 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 回答
0

您需要转义保护内部引号的斜线:

JSON.parse('{"foo":"{\\"test\\":\\"hello world\\"}"}');
// == Object {foo: '{"test":"hello world"}'}
于 2013-06-18T21:07:39.120 回答