[英]Javascript decode JSON string which contains an encoded string
我有以下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字符串? 如果有人想尝试, 这是一个小提琴 。
您遇到的问题是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
。
你的代码应该是
$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/
问题是双重编码为JSON。 如果需要将数据保留为字符串,则需要所需的解决方案
$bar->foo = addslashes(json_encode($foo));
代码返回它应该返回的内容。
当json_encodein $ bar时,$ bar-> foo是一个字符串。 转义此字符串以生成正确的输出。
$bar->foo = json_encode($foo);
应该是$bar->foo = $foo
你需要逃避保护内部引号的斜线:
JSON.parse('{"foo":"{\\"test\\":\\"hello world\\"}"}');
// == Object {foo: '{"test":"hello world"}'}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.