Javascript解码包含编码字符串的JSON字符串

时间:2013-06-18 20:52:44

标签: php javascript jquery json escaping

我有以下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中解析这个字符串(例如使用jQuery的$.parseJSON):

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

我希望记录以下内容:

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

但是在运行它时会出现Unexpected token t错误(使用铬)

如何在Javascript中解析这个json字符串? Here's a fiddle如果有人想尝试。

5 个答案:

答案 0 :(得分: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-* attribute或可以使用AJAX请求的JSON源。

当从服务器(或从属性)请求数据时,它将作为正确转义的JavaScript字符串,这是解析对象所需的JSON.parse

答案 1 :(得分:2)

您的代码应为

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

只需json在最后编码一次,然后在另一端的开头解码一次。


至于jsfiddle,你不会考虑字符串文字在它们成为javascript内存中的字符串之前经过额外的解码层&#34;。

在这种情况下设置字符串文字的正确方法是(JS-JSON-JSON):

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

简单地颠倒你所做的编码步骤。 http://jsfiddle.net/Jmjjp/2/

答案 2 :(得分:1)

问题是双重编码为​​JSON。如果需要将数据保留为字符串,则需要的解决方案是

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

答案 3 :(得分:0)

代码返回它应该返回的内容。

当json_encodein $ bar时,$ bar-&gt; foo是一个字符串。转义此字符串以产生正确的输出。

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

应为$bar->foo = $foo

答案 4 :(得分:0)

你需要逃避保护内部引号的斜杠:

JSON.parse('{"foo":"{\\"test\\":\\"hello world\\"}"}');
// == Object {foo: '{"test":"hello world"}'}