【问题标题】:PHP json_decode returns null value because of syntax error由于语法错误,PHP json_decode 返回空值
【发布时间】:2018-10-01 07:35:18
【问题描述】:
$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 的字符串,他们说 Valid 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); 

我添加了这段代码,然后它工作正常。

【问题讨论】:

  • “所以我知道有一些语法错误,但我在 JSONLint 尝试了字符串,他们说 Valid JSON”——当我尝试它时,它会抛出错误。
  • @Quentin 真的吗?我没有错误
  • @IslamElshobokshy — 真的。确保您尝试验证您的 JSON 而不是字符串文字的 PHP 源代码。
  • @Quentin 我做到了,老实说,我使用 JsonLint 没有出错

标签: php json


【解决方案1】:

查看JSON中的字符串规则:

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

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

例如\\X\\V

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

  1. 为 JSON 转义 \ 与另一个 \
  2. 使用 PHP 的另一个 \ 转义每个

...给你 4 个\ 字符。

【讨论】:

  • $foo_json = str_replace('\\', '\\\\', $foo_json);添加此代码,然后工作正常!谢谢!
【解决方案2】:

试试下面的代码

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

一切正常。

【讨论】:

  • 虽然这会创建将解析的 JSON,但它会丢弃其中的数据。斜线需要转义而不是丢弃。
  • 问题是反斜杠,但我不想删除它,因为我需要反斜杠数据。
【解决方案3】:

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

【讨论】:

  • 感谢您的回答。这是 UTF-8 文件,其他 json_decode 方法对其他字符串成功。
【解决方案4】:

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

$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);

【讨论】:

  • 为什么投反对票?不需要 UTF8 编码或任何东西。这只是因为您需要为 PHP 正确转义的转义值。上面的代码正确解析了你的 json 字符串..
  • 我用问题中的代码对其进行了测试。输出仍然是无效的 JSON,无法解析。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
相关资源
最近更新 更多