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

PHP*_*Pst 1 php json

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

{
    "t": "\\"
}
Run Code Online (Sandbox Code Playgroud)

PHP json_encode无法解析它:

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

var_dump($r); //returns null
Run Code Online (Sandbox Code Playgroud)

注意:问题是清理,问题是一样的.

Alv*_*ong 6

你需要这个:

<?php
json_decode('{
    "target": "^http://(www|corail)\\\\.sudoc\\\\.abes\\\\.fr"
}')
Run Code Online (Sandbox Code Playgroud)

你\\只逃脱了一次.你需要两次,第一次是PHP,第二次是JSON.

PS因为你在JSON中的字符串看起来像一个RegExp,你可能需要再做一次转义,即再次反转双倍的数量


让我试着想象一下发生了什么.首先在PHP中,您以这种方式编写字符串:

$s='{"a":"^http://(www|corail)\\\\\\\\.sudoc\\\\\\\\.abes\\\\\\\\.fr"}'
Run Code Online (Sandbox Code Playgroud)

在此之后,如果echo $s你能找到这个:

{"a":"^http://(www|corail)\\\\.sudoc\\\\.abes\\\\.fr"}
Run Code Online (Sandbox Code Playgroud)

然后,如果您json_decode($s),该成员a将拥有以下内容:

^http://(www|corail)\\.sudoc\\.abes\\.fr
Run Code Online (Sandbox Code Playgroud)

最后,当您执行RegExp时,\\会进一步转义\.


如果你试试:

<?php
echo '{
    "target": "^http://(www|corail)\\.sudoc\\.abes\\.fr"
}';
Run Code Online (Sandbox Code Playgroud)

输出是:

{
    "target": "^http://(www|corail)\.sudoc\.abes\.fr"
}
Run Code Online (Sandbox Code Playgroud)

看错了什么?在JSON(JavaScript)中,\.它不是有效的转义序列,因此它不是有效的JSON,因此json_decode将失败,返回NULL.


如果你试试:

<?php
echo '{
    "target": "^http://(www|corail)\\\\.sudoc\\\\.abes\\\\.fr"
}';
Run Code Online (Sandbox Code Playgroud)

输出是:

{
    "target": "^http://(www|corail)\\.sudoc\\.abes\\.fr"
}
Run Code Online (Sandbox Code Playgroud)

转义序列\\对JSON有效.