1

考虑 j.json其内容遵循有效 json 的文件:

{
    "t": "\\"
}

PHP json_encode 无法解析:

$r=json_decode(file_get_contents('j.json'));

var_dump($r); //returns null

注意:问题已清理,问题相同。

4

5 回答 5

6

你需要这个:

<?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 有效。

于 2012-07-22T13:21:25.493 回答
1

尝试

json_decode('{
    "target": "^http://(www|corail)\\\\.sudoc\\\\.abes\\\\.fr"
}');

你有一个额外的逗号,你必须两次转义反斜杠(首先是 php 字符串,然后是 json)。

echo "\\"; // outputs "\"
echo "\\\\"; // outputs "\\", ie what you need for the json
于 2012-07-22T13:16:55.590 回答
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,然后“导出”它以将其视为 PHP 字符串。

然后我将它与您的字符串进行了比较。

结果如下:

'{"target":"^http:\\/\\/(www|corail)\\\\.sudoc\\\\.abes\\\\.fr"}'
{ "target": "^http://(www|corail)\.sudoc\.abes\.fr" }

您可以清楚地看到您的字符串遗漏了一些字符:您需要转义所有正斜杠和反斜杠。

于 2012-07-22T13:21:01.453 回答
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 "//"
于 2012-07-24T08:39:56.737 回答
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" }

现在取决于您要完成的工作(在您的问题的当前编辑中没有提到目标),您应该能够弄清楚该怎么做?

于 2012-07-24T09:10:36.683 回答