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 说 and 之间发生了一些事情json_encode.parseJSON他是对的。

做一个alert(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_encode 应用于包装在另一个数组中的数组,该数组也是 json 编码的。如果您在创建数据的脚本中有多个 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 脚本元素中时,正斜杠字符可能会导致问题(当前面有 a 时,它会触发“脚本元素结尾”的 SGML 规则)。作为预防措施,他们被逃脱了。

因为当我尝试使用 jQuery.parseJSON(response); 在我的 js 脚本中,它返回 null。所以我猜它与斜线有关。

它没有。在 JSON"/""\/"是等价的。

您在问题中列出的 JSON 是有效的(您可以使用jsonlint对其进行测试)。json_encode您的问题很可能与和之间发生的事情有关parseJSON

于 2012-04-25T11:34:41.910 回答
3

发生这种情况是因为 JSON 格式使用 ""(Quotes) 并且这些引号之间的任何内容都是有用的信息(键或数据)。

假设您的数据是:He said "This is how it is done". 那么实际数据应该是这样的"He said \"This is how it is done\"."

这可确保将其\"视为"(Quotation mark)JSON 格式而不是 JSON 格式。这被称为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 中使用刀片来构建一个三视图表单,所以我可以前后移动,我在每个后退和前进按钮验证之间,当我在不重新加载页面的情况下返回表单时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 以确保删除斜杠

好吧,无论您是否删除斜杠,eval 都会毫无问题地解析 json。

<?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 回答