考虑 j.json
其内容遵循有效 json 的文件:
{
"t": "\\"
}
PHP json_encode 无法解析:
$r=json_decode(file_get_contents('j.json'));
var_dump($r); //returns null
注意:问题已清理,问题相同。
你需要这个:
<?php
json_decode('{
"target": "^http://(www|corail)\\\\.sudoc\\\\.abes\\\\.fr"
}')
你只逃过\\
一次s。您需要两次,第一次是 PHP,第二次是 JSON。
PS由于您在JSON中的字符串看起来像一个正则表达式,您可能需要再转义一次,即再次将反斜杠的数量加倍
让我试着想象一下发生了什么。首先在 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 有效。
尝试
json_decode('{
"target": "^http://(www|corail)\\\\.sudoc\\\\.abes\\\\.fr"
}');
你有一个额外的逗号,你必须两次转义反斜杠(首先是 php 字符串,然后是 json)。
echo "\\"; // outputs "\"
echo "\\\\"; // outputs "\\", ie what you need for the json
<?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,然后“导出”它以将其视为 PHP 字符串。
然后我将它与您的字符串进行了比较。
结果如下:
'{"target":"^http:\\/\\/(www|corail)\\\\.sudoc\\\\.abes\\\\.fr"}'
{ "target": "^http://(www|corail)\.sudoc\.abes\.fr" }
您可以清楚地看到您的字符串遗漏了一些字符:您需要转义所有正斜杠和反斜杠。
不幸 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 "//"
这个问题显然是关于逃跑的。似乎有一些关于如何在 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" }
现在取决于您要完成的工作(在您的问题的当前编辑中没有提到目标),您应该能够弄清楚该怎么做?