$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);
我添加了此代码,然后工作正常。
答案 0 :(得分:1)
查看JSON中字符串的规则:
\
字符可以跟随的字符集非常有限。
您的输入多次违反此规定:
例如\\X
和\\V
请记住,\
是PHP字符串文字中的特殊字符,因此,如果要在JSON中转义\
,则需要:
\
来将\
转义为JSON \
for PHP …给您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);