为什么json_encode会添加反斜杠?

Ste*_*ven 46 php json

我已经使用json_encode了很长时间,到目前为止我没有任何问题.现在我正在使用上传脚本,我尝试在文件上传后返回一些JSON数据.

我有以下代码:

print_r($result); // <-- This is an associative array
echo json_encode($result); // <-- this returns valid JSON
Run Code Online (Sandbox Code Playgroud)

这给了我以下结果:

// 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}}
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我为什么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})
Run Code Online (Sandbox Code Playgroud)

这不是有效的JSON.它还添加了status:200,我不知道它来自何处.

可能是Plupload bind我的返回数据做了什么?

这是我的js脚本:

  uploader.bind('FileUploaded', function(up, file, data) {
    alert(data.toSource());
    $('#' + file.id + " b").html("100%");
  });
Run Code Online (Sandbox Code Playgroud)

小智 66

只需使用"JSON_UNESCAPED_SLASHES"选项(在5.4版之后添加).

json_encode($array,JSON_UNESCAPED_SLASHES);
Run Code Online (Sandbox Code Playgroud)


Que*_*tin 36

谁能告诉我为什么json_encode会添加斜杠?

<当嵌入HTML脚本元素时,正斜杠字符可能会导致问题(当它前面有一个触发"脚本元素结束"的SGML规则时).作为预防措施,他们逃脱了.

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

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

您在问题中列出的JSON是有效的(您可以使用jsonlint进行测试).你的问题很可能与之间发生了什么它做json_encodeparseJSON.


Mee*_*Din 29

我刚刚在我的一些脚本中遇到过这个问题,而且似乎正在发生,因为我将json_encode应用于另一个数组中的数组,该数组也是json编码的.如果在创建数据的脚本中有多个foreach循环,则很容易做到.始终在最后应用json_encode.

这是发生了什么.如果你这样做:

$data[] = json_encode(['test' => 'one', 'test' => '2']);
$data[] = json_encode(['test' => 'two', 'test' => 'four']);
echo json_encode($data);
Run Code Online (Sandbox Code Playgroud)

结果是:

["{\"test\":\"2\"}","{\"test\":\"four\"}"]
Run Code Online (Sandbox Code Playgroud)

那么,你真正需要做的是:

$data[] = ['test' => 'one', 'test' => '2'];
$data[] = ['test' => 'two', 'test' => 'four'];
echo json_encode($data);
Run Code Online (Sandbox Code Playgroud)

这将回归

[{"test":"2"},{"test":"four"}]
Run Code Online (Sandbox Code Playgroud)

  • 你是对的。双 json_ecoding 将添加这些反斜线并将我的数组更改为字符串。@RicardoParro 我的结果与你的类似。最后只需 json_encode 一次即可。 (2认同)