为啥 json_encode 添加反斜杠?

Posted

技术标签:

【中文标题】为啥 json_encode 添加反斜杠?【英文标题】:Why is json_encode adding backslashes?为什么 json_encode 添加反斜杠? 【发布时间】:2012-05-06 01:57:34 【问题描述】:

我已经使用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 说 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%");
  );

【问题讨论】:

您尝试使用搜索吗? ***.com/questions/5272311/… 是的,我已经搜索并看到了各种回复。问题是我没有做任何新的事情,我已经注意到在我的代码中已经做了一百次了。 “无效”json 看起来像是对 jsonp 请求的错误尝试,并且没有指定回调函数名称。 当我 json_encode 一个 json 发生这种情况! 【参考方案1】:

只需使用“JSON_UNESCAPED_SLASHES”选项(在 5.4 版之后添加)。

json_encode($array,JSON_UNESCAPED_SLASHES);

【讨论】:

【参考方案2】:

我刚刚在我的一些脚本中也遇到了这个问题,它似乎正在发生,因为我将 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"]

【讨论】:

这实际上对我不起作用。结果是 "[\"test\":\"2\",\"test\":\"four\"]" 您使用的是我提供的示例代码吗?请参阅 phpFiddle 的 bit.ly/1OWrAdr。 你是对的。双 json_ecoding 将添加那些反斜杠并将我的数组更改为字符串。 @RicardoParro 我和你的结果相似。最后只需 json_encode 一次。【参考方案3】:

谁能告诉我为什么 json_encode 加斜线?

当嵌入到 HTML 脚本元素中时,正斜杠字符可能会导致问题(当前面带有 &lt; 时,它会触发“脚本元素结尾”的 SGML 规则)。作为预防措施,他们被逃脱了。

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

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

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

【讨论】:

你能详细说明一下情况吗?一个链接就好了。 @Quentin 谢谢。所以 JSON 总是会在需要的地方添加斜杠。但是 jQuery 的 parseJSON 仍然返回 null。这告诉我该函数接收到一个无效的字符串。那么我该怎么做才能解决这个问题呢? @Steven — 查看您传递给 parseJSON 的确切内容将是一个明智的起点。然后从那里向后追溯。 我找到了答案。 JSON 是有效的。我试着做$.parseJSON(response),但正确的方法是$.parseJSON(response.response)。那成功了。 Plupload 将返回的数据包装在response 参数中。 可以通过设置选项 JSON_UNESCAPED_SLASHES 来禁用它【参考方案4】:

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

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

这确保\" 被视为"(Quotation mark) 而不是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\""]

【讨论】:

【参考方案5】:

确保您的 php 脚本具有正确的标题,否则它将添加斜杠 header('Content-Type: application/json');

【讨论】:

【参考方案6】:

我有一个非常相似的问题,我有一个准备发布的数组。在我的帖子功能中,我有这个:

json = JSON.stringfy(json);

这里的细节是我在 laravel 中使用刀片来构建一个三视图表单,所以我可以前后移动,我在每个后退和前进按钮验证之间以及当我返回表单而不重新加载时我的 json 页面被反斜杠填充。我在每次验证中 console.log(json) 并意识到 json 被视为字符串而不是对象。

最后,我不应该分配json = JSON.stringfy(json),而是将其分配给另一个变量。

var aux = JSON.stringfy(json);

这样我把 json 作为一个对象,而不是一个字符串。

【讨论】:

【参考方案7】:

json_encode 将始终添加斜杠。

查看手册上的一些示例HERE

这是因为如果有一些字符需要转义,就会产生问题。

要使用 json,请解析您的 json 以确保删除斜杠

不管你是否删除斜线,json 都将被 eval 解析而没有任何问题。

<?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 时遗漏了什么

【讨论】:

在我的php.ini 魔术引号设置为OFF:magic_quotes_gpc = Off 该问题清楚地表明正在使用适当的 JSON 解析器解析 JSON。请不要推荐人们使用eval,我们在几年前就超越了它进行 JSON 解析。 嘿,请检查我正在使用的代码。可能是你错过了什么。

以上是关于为啥 json_encode 添加反斜杠?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用json_encode回显没有反斜杠的值[重复]

PHP json_encode 反斜杠和数组名称的问题

json_encode() 转义 / 带有 \ [重复]

如何删除 json_encode() 函数上的反斜杠?

php json_encode输出为空问题

为啥JSON字符串当中会出现反斜杠?