考虑j.json
文件,其内容遵循有效的json:
{
"t": "\\"
}
PHP json_encode无法解析它:
$r=json_decode(file_get_contents('j.json'));
var_dump($r); //returns null
注意:问题已清理,问题相同。
答案 0 :(得分:6)
你需要这个:
<?php
json_decode('{
"target": "^http://(www|corail)\\\\.sudoc\\\\.abes\\\\.fr"
}')
你只逃了一次\\
。你需要两次,第一次是PHP,第二次是JSON。
<强> P.S。由于JSON中的字符串看起来像RegExp,因此您可能需要再次进行一次转义,即再次使反斜杠的数量加倍
让我试着想象一下发生了什么。首先在PHP中,您以这种方式编写字符串:
$s='{"a":"^http://(www|corail)\\\\\\\\.sudoc\\\\\\\\.abes\\\\\\\\.fr"}'
在此之后,如果你echo $s
,你会发现:
{"a":"^http://(www|corail)\\\\.sudoc\\\\.abes\\\\.fr"}
然后,如果您json_decode($s)
,则成员a
将拥有内容:
^http://(www|corail)\\.sudoc\\.abes\\.fr
最后,当您执行RegExp时,\\
会进一步转义为\
。
如果您尝试:
<?php
echo '{
"target": "^http://(www|corail)\\.sudoc\\.abes\\.fr"
}';
输出是:
{
"target": "^http://(www|corail)\.sudoc\.abes\.fr"
}
看看有什么问题?在JSON(JavaScript)中,\.
不是有效的转义序列,因此不是有效的JSON ,因此json_decode
将失败,返回NULL
。
如果您尝试:
<?php
echo '{
"target": "^http://(www|corail)\\\\.sudoc\\\\.abes\\\\.fr"
}';
输出是:
{
"target": "^http://(www|corail)\\.sudoc\\.abes\\.fr"
}
转义序列\\
对JSON有效。
答案 1 :(得分:1)
尝试
json_decode('{
"target": "^http://(www|corail)\\\\.sudoc\\\\.abes\\\\.fr"
}');
你有一个额外的逗号,你必须两次逃避反斜杠(首先是php字符串,然后是json)。
echo "\\"; // outputs "\"
echo "\\\\"; // outputs "\\", ie what you need for the json
答案 2 :(得分:1)
<?php
echo var_export(json_encode((object)array('target'=>'^http://(www|corail)\\.sudoc\\.abes\\.fr')));
echo '<br/>';
echo '{
"target": "^http://(www|corail)\\.sudoc\\.abes\\.fr"
}';
我在这里做的是我在PHP中手动编写对象,然后将其编码为JSON,然后"exported"将其视为PHP字符串。
然后我将它与你的字符串进行比较。
结果如下:
'{"target":"^http:\\/\\/(www|corail)\\\\.sudoc\\\\.abes\\\\.fr"}'
{ "target": "^http://(www|corail)\.sudoc\.abes\.fr" }
你可以清楚地看到你的字符串错过了一些字符:你需要逃避所有向前和向后斜线。
答案 3 :(得分:0)
不幸的是json_decode
实现不正确,并且在获取一些有效的json 文件时可能会返回null,或者可能会修改它们的值,您可以使用以下函数来解码所有有效的json字符串:
function r_json_decode($jsonString,$originalJsonValue=false){
$j=($originalJsonValue)?str_replace('\\','\\\\\\\\',$jsonString):str_replace('\\','\\\\',$jsonString);
return json_decode($j);
}
echo(r_json_decode(file_get_contents('j.json'))->t); // prints "/"
echo(r_json_decode(file_get_contents('j.json'),true)->t); //prints "//"
答案 4 :(得分:0)
关于逃避的问题很明显。似乎有一些关于如何在PHP中解析JSON的讨论(参见手册http://php.net/manual/en/function.json-decode.php中的注释)。
无论如何,正如你可以从这个“小提琴”http://codepad.viper-7.com/2t4pP0中看到的那样,你需要开始添加反斜杠!
它这样做:
<?php
$r=json_decode('{"t": "a"}');
var_dump($r);
echo "<br/>\n";
$r=json_decode('{"t": "\a"}');
var_dump($r);
echo "<br/>\n";
$r=json_decode('{"t": "\\a"}');
var_dump($r);
echo "<br/>\n";
$r=json_decode('{"t": "\\\a"}');
var_dump($r);
echo "<br/>\n";
$r=json_decode('{"t": "\\\\a"}');
var_dump($r);
和输出
object(stdClass)#1 (1) { ["t"]=> string(1) "a" }
NULL
NULL
object(stdClass)#1 (1) { ["t"]=> string(2) "\a" }
object(stdClass)#2 (1) { ["t"]=> string(2) "\a" }
现在取决于你想要完成什么(在当前的问题编辑中没有提到目标),你应该能够弄清楚如何处理这个问题?