传递json文件时PHP json_decode()中的错误

时间:2012-07-22 13:14:43

标签: php json

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

{
    "t": "\\"
}

PHP json_encode无法解析它:

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

var_dump($r); //returns null

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

5 个答案:

答案 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" }

现在取决于你想要完成什么(在当前的问题编辑中没有提到目标),你应该能够弄清楚如何处理这个问题?