由于语法错误,PHP json_decode返回空值

时间:2018-10-01 07:35:18

标签: php json

$foo_json = '{"hoge":"ywwxEu|`tYdBeARGJ?nJ~BHHmDjX|PdEl@Rj@\\XVtKtK\\VbKnFrIbEzEbBnEbBfDfAxBz@LJjBl@jEzAfZzKDPY|DUdCGbAFL?|AD~AJ\\LNPJ~B|@p@Ll@FRDd@RvBnAfA`@dAl@^NhAVd@@p@?h@H`@Pv@l@TR^f@`Rd@xAFdEVnCLjJn@Cn@FlRDh@HRHHjKpG\\\\jC`G|EvJ|BjGf@vAJh@nGpC`FrBbG`D~@XdBRnNtAnTdBf@Jn@Zf@h@pB`DrD|EZl@jBfEf@`Af@r@tCpChFrG~@zAx@dBdB~Cz@xA`AxA|@l@f@VdDrAnAl@jI~CpCv@|@f@~An@jIxD~CdAzAl@rCvAjI|CzJpClJbCvLdDbn@lH`d@pF~Df@dDn@hA`@hBfA~AbAzQpMvHhFhQ~L~G`FtBrArCnBbBnAjB`A`~@~^tBx@n@RfB\\b@Fh@B|BBpV{AfSgArJq@~@?dBF`Cd@nFjAhXdG~@VtMpEd[fKfL|DxWrI~Y`KvLtDp\\zK|DnAzBbAbA|@rAtApAfBhA`Cl@fBh@lBtEpQh@fBrAjFdDpLdArCj@fAd@x@`BvBlDnDrVxWjDzD`GlGhCvBvBvA|DjBlC|@hTvEfBNvABvISxUo@|JSlA@tBLt@LdAXv@ZnB~@~@t@xAnAf@f@xEdEzAbBzAnBlWp_@bAnBlBpE|@tChBdFhBjGzCnJrCdHp@jAxAxBlGvH~@|Ab@bAp@xBnCdMd@pBl@fBt@bB\\j@v@lAxUlUtCjCdBz@nJdIdJbIrH`H~F|EjDxCzAnBNb@HdAJ|Fb@jDTpHq@@"}';
$foo = json_decode($foo_json);

我写了这段代码,但是json_decode返回null,而json_last_error()返回“ JSON_ERROR_SYNTAX”。 所以我知道有一些语法错误,但是我在JSONLint尝试了该字符串,他们说是有效JSON。

可能是因为字符串很复杂并且包含符号的原因。 我不明白怎么了。

PHP5.6.33

CentOS 6.6版

答案在这里。 问题是反斜杠,我不喜欢删除它。 json_decode returns JSON_ERROR_SYNTAX but online formatter says the JSON is OK 上面的文章说只需删除它,在这种情况下,我需要将其替换。

$foo_json = str_replace('\\', '\\\\', $foo_json); 

我添加了此代码,然后工作正常。

4 个答案:

答案 0 :(得分:1)

查看JSON中字符串的规则:

JSON strings

\字符可以跟随的字符集非常有限。

您的输入多次违反此规定:

例如\\X\\V

请记住,\是PHP字符串文字中的特殊字符,因此,如果要在JSON中转义\,则需要:

  1. 使用另一个\来将\转义为JSON
  2. 使用另一个\ for PHP
  3. 每个

…给您4个\字符。

答案 1 :(得分:0)

请尝试以下代码

$foo_json =preg_replace('/\\\\/', '', $foo_json);
$foo = json_decode($foo_json);
  print_r( $foo);exit;

一切正常。

答案 2 :(得分:-2)

json_(de | zh)代码需要具有UTF8数据。检查您的输入是否为UTF8,如果不是,则将您的输入转换为UTF-8,然后使用json_(de | en)code进行获取;)

答案 3 :(得分:-2)

这应该导致有效的响应。 (处理换行符和特殊转义符)

$json = str_replace("\n","\\n",$foo_json );
$json = str_replace("\r","",$json);
$json = preg_replace('/([{,]+)(\s*)([^"]+?)\s*:/','$1"$3":',$json);
$json = preg_replace('/(,)\s*}$/','}',$json);
var_dump($json);