我在服务器上收到一个JSON字符串,必须通过json_decode进行转换。该字符串可能包含任何内容在一些难以重现的问题之后,我尝试了以下测试:
$data = '{"client":"Test @#€%&-+()\/\\_*\""}';
$data = json_decode($data);
var_dump($data); die;
返回NULL。如果我删除\\,代码可以正常工作。我在谷歌开发工具中试过这个,它可以在Javascript中运行。如何在json_decode中使其工作?
谢谢!
答案 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('{"Server": "\\\\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"
}