PHP json_decode反斜杠

时间:2016-05-23 19:37:38

标签: php json server

我在服务器上收到一个JSON字符串,必须通过json_decode进行转换。该字符串可能包含任何内容在一些难以重现的问题之后,我尝试了以下测试:

$data = '{"client":"Test @#€%&-+()\/\\_*\""}';
$data = json_decode($data);
var_dump($data); die;

返回NULL。如果我删除\\,代码可以正常工作。我在谷歌开发工具中试过这个,它可以在Javascript中运行。如何在json_decode中使其工作?

谢谢!

2 个答案:

答案 0 :(得分:0)

这里遇到null的问题是由于双重转义引起的:一个用于PHP字符串,另一个用于稍后解释的json。所以例如添加几个\后,它的行为就像:

php > $data = '{"client":"Test @#%&-+()\\/\\\\_*\""}';
var_dump(json_decode($data));
object(stdClass)#1 (1) {
  ["client"]=>
  string(18) "Test @#%&-+()/\_*""
}

您可以将测试json放入文件并读取它,然后您就不必担心将任何内容转义为PHP字符串。

答案 1 :(得分:0)

不幸的是,json_decode() 在尝试解码带有双反斜杠 ("\\") 的 JSON 字符串时会抛出 JsonException。

<?php
var_dump(
    json_decode(
        '{"Server": "\\\\ComputerName\\MainDirectory\\SubDirectory"}',
    false, 512, JSON_THROW_ON_ERROR)
);

<br />
<b>Fatal error</b>:  Uncaught JsonException: Syntax error in [...][...]:2
Stack trace:
#0 [...][...](2): json_decode('{&quot;Server&quot;: &quot;\\\\C...', false, 512, 4194304)
#1 {main}
  thrown in <b>[...][...]</b> on line <b>2</b><br />

为了解决这个问题, 我们可以使用 str_replace() 将那些双反斜杠 ("\\") 转换为四反斜杠 ("\\\\")。

<?php
var_dump(
    json_decode(
        str_replace('\\','\\\\','{"Server": "\\\\ComputerName\\MainDirectory\\SubDirectory"}'),
        false, 512, JSON_THROW_ON_ERROR
    )
);


object(stdClass)#1 (1) {
    ["Server"]=>
    string(41) "\\ComputerName\MainDirectory\SubDirectory"
}