【问题标题】:Laravel - Json Encode Works Fine But Returns Malformed UTF-8 Error RegardlessLaravel - Json 编码工作正常,但无论如何都会返回格式错误的 UTF-8 错误
【发布时间】:2020-07-03 19:35:53
【问题描述】:

问题

返回的 JSON 编码正确,但 json_last_error 等同于 5,因此 Laravel 在 JsonResponse->setData() 中创建响应时抛出此异常。

相关参考文献

symfony 和 PHP 7.3 的已解决错误报告:https://github.com/symfony/symfony/issues/31447 提到了这个确切的问题。那就是:

If a json_encode()/json_decode() without JSON_THROW_ON_ERROR encoding option set throws an error, any subsequent call to the same with that flag set will not reset the error of the previous call.

JSON_THROW_ON_ERROR RFC 提及此行为是设计使然:https://wiki.php.net/rfc/json_throw_on_error

不幸的是,Laravel 的代码使用了该标志,但不满足这种行为,并且如果 json_last_error() 返回非零值则抛出异常。在这种情况下应该忽略它,因为它总是引用以前的错误。也许应该添加版本检查。

调查

我还搜索了我的应用程序的碗,并没有发现没有设置 JSON_THROW_ON_ERROR 的行为不端的 json_encode/json_decode,所以我确信在中间件调用之前它是 Laravel 内部的。

附加上下文

今天我们的服务器突然开始发生这种情况。当用户通过选定系统的 Web 应用程序连接到服务器时,就会发生这种情况。即使系统类型不应该影响服务器端响应生成,但 Web 应用程序始终会为特定 PC/移动设备生成此错误。

【问题讨论】:

    标签: json laravel symfony exception php-7.4


    【解决方案1】:

    提议的黑客攻击

    筛选完 Symfony 错误报告后,我发现最简单的解决方法是通过一个无关紧要的 json_encode('1') 调用来清除错误。这有效地将错误代码重置为0,并且后面的 JSON 方法可以正常工作。

    幸运的是,我们有自己的响应生成类,所以只需在移交给 Laravel 之前添加它就可以了。

    这仍然是一个 hack。我对更好的解决方案或任何可用的错误修复更感兴趣。

    【讨论】:

      猜你喜欢
      • 2019-06-30
      • 2018-02-28
      • 2018-05-24
      • 1970-01-01
      • 1970-01-01
      • 2016-11-13
      • 2014-08-24
      相关资源
      最近更新 更多