Laravel:无法对​​有效负载进行 JSON 编码。错误代码:5

2023-11-22

我正在开发 Laravel (v5.7) 应用程序,它将上传的 CSV(带有联系人)转换为数组,然后在调度作业类时将其作为参数传递。

以下是 CSV 文件的示例(支持的格式):

123456,Richard,Smith
654321,John,Doe

上传的 (CSV) 文件的处理方式如下:

$file_path = $request->file_name->store('contacts');
$file = storage_path('app/' . $file_path);

$contactsIterator = $this->getContacts($file);

$contacts = iterator_to_array($contactsIterator); // Array of contacts from uploaded CSV file
    protected function getContacts($file)
    {
        $f = fopen($file, 'r');

        while ($line = fgets($f))
        {
            $row = explode(",", $line);

            yield [
                'phone'     => !empty($row[0]) ? trim($row[0]) : '',
                'firstname' => !empty($row[1]) ? trim($row[1]) : '',
                'lastname'  => !empty($row[2]) ? trim($row[2]) : '',
            ];
        }
    }

最后,$contacts数组被传递给调度的作业:

ImportContacts::dispatch($contacts);

这个作业类看起来像这样:

    public function __construct($contacts)
    {
        Log::info('ImportContacts@__construct START');
        $this->contacts = $contacts;
        Log::info('ImportContacts@__construct END');
    }

    public function handle()
    {
        Log::info('ImportContacts@handle');
    }

...一切工作正常(没有错误),直到我尝试使用此 CSV:

123456,Richardÿ,Smith
654321,John,Doe

请注意ÿ。因此,当我尝试使用此 CSV 时,我收到此错误异常:

/code_smsto/vendor/laravel/framework/src/Illuminate/Queue/Queue.php | 91 | Unable to JSON encode payload. Error code: 5 

...我的日志文件如下所示:

  error local   2019-11-11 17:17:18     /code_smsto/vendor/laravel/framework/src/Illuminate/Queue/Queue.php | 91 | Unable to JSON encode payload. Error code: 5
  info  local   2019-11-11 17:17:18     ImportContacts@__construct END
  info  local   2019-11-11 17:17:18     ImportContacts@__construct START 

如你看到的 -handle方法从未被执行过。如果我删除ÿ- 没有错误并且handle被执行。

我尝试解决这个问题,但没有成功:

  1. Apply utf8_encode:
    protected function getContacts($file, $listId)
    {
        $f = fopen($file, 'r');

        while ($line = fgets($f))
        {
            $row = explode(",", $line);

            yield [
                'phone'     => !empty($row[0]) ? utf8_encode($row[0]) : '',
                'firstname' => !empty($row[1]) ? utf8_encode($row[1]) : '',
                'lastname'  => !empty($row[2]) ? utf8_encode($row[2]) : '',
            ];
        }
    }

...还有它works(没有错误,不管是否有那个ÿ),但随后希腊字母和西里尔字母会变成问号。例如,这个:Εθνικής会变成???????.

我也尝试过mb_convert_encoding($row[1], 'utf-8')- 它不会将希腊语或西里尔字母变成问号,但是这个ÿ性格将成为?.

  1. 将上传的 CSV 文件的“处理”(转换为数组)移至@handleJob 类的方法有效,但后来我无法将该数组中的数据存储到数据库(MongoDB)中。请参阅下面的更新。

调试:

这就是我从中得到的dd($contacts);:

enter image description here

所以,它有“b”,其中ÿ是。并且,经过一番“谷歌搜索”后,我发现这个“b”意味着“二进制字符串”,即非unicode字符串,函数在字节级别上运行(字符串前面的 b 有何作用?).

我的理解是这样的:当调度 Job 类时,Laravel 尝试对其进行“JSON 编码”(传递参数/数据),但由于存在二进制数据(非 unicode 字符串)而失败。 无论如何,我无法找到解决方案(能够使用以下命令处理此类 CSV 文件)ÿ).

我在用:

  • 拉拉维尔 5.7
  • PHP 7.1.31-1+ubuntu16.04.1+deb.sury.org+1 (cli)(构建时间:2019 年 8 月 7 日 10:22:48)( NTS )
  • Redis 支持的队列

UPDATE

当我将上传的 CSV 文件的“处理”(转换为数组)移至@handleJob 类的方法 - 我没有收到此错误(Unable to JSON encode payload. Error code: 5),但是当我尝试使用以下命令存储有问题的二进制数据时ÿ (b"Richardÿ") 到 MongoDB - 它失败了。奇怪的是我没有收到任何错误异常message在日志文件中,所以我将所有内容放入 try-catch 中,如下所示:

        try {
            // Insert data into MongoDB
        } catch (Exception $e) {
            Log::info($e->getFile());
            Log::info($e->getLine());
            Log::info($e->getMessage());
        }

...这就是结果:

enter image description here

无论如何,我相信它失败的原因是b"Richardÿ",我猜解决方案是编码字符串,但正如我所提到的 - 我无法找到有效的解决方案:

  • utf8_encode有效(没有错误,无论是否有错误ÿ),但随后希腊字母和西里尔字母会变成问号。例如,这个:Εθνικής会变成???????
  • mb_convert_encoding($row[1], 'utf-8')- 它不会将希腊语或西里尔字母变成问号,但是这个ÿ性格将成为?.
  • iconv('windows-1252', 'UTF-8', $row[1])- 有效(没有错误,无论是否有错误ÿ),但是当有希腊语或西里尔字母时 - 它会失败(我收到此错误异常:iconv(): Detected an illegal character in input string)

您有多种方法可以处理它,但我推荐以下两种。在这两种情况下,想法都是存储 UTF-8 字符串。

一种更简单的方法是,从(您的)预定义列表中找出它的编码并将其转换为 UTF8。

$encoding = mb_detect_encoding($content, 'UTF-8, ISO-8859-1, WINDOWS-1252, WINDOWS-1251', true);
if ($encoding != 'UTF-8') {
    $string = iconv($encoding, 'UTF-8//IGNORE', $row[1]);
}

第二种方法是使用中概述的第三方库这个答案

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel:无法对​​有效负载进行 JSON 编码。错误代码:5 的相关文章

  • PHP 和 DOM 文档

    我有一个关于 DOMDocument 的使用和创建 XML 的问题 我有一个 PHP 程序 加载到 XML 文件中 处理XML的每个节点 行 将其发送到另一个进程 然后该进程返回一个 XML 元素 我获取节点的字符串表示形式 以便可以创建
  • MySQL 最佳实践:SELECT 子递归尽可能提高性能?

    我想选择一个根项目及其子项 使其性能尽可能高 我更喜欢使用嵌套集模型 但这次表结构遵循邻接模型 有关嵌套集和邻接模型的更多信息 http mikehillyer com articles managing hierarchical data
  • curl 无法获取网页内容,为什么?

    我正在使用curl 脚本转到链接并获取其内容以进行进一步操作 以下是链接和curl脚本
  • 当用户再次访问同一页面时保持登录状态?

    目前我正在使用会话来登录用户 但是当我关闭浏览器并再次打开它时 我必须再次登录 你如何让用户在 2 周内保持登录状态 那么是通过cookie吗 那么您想要 在这台计算机上记住我 选项吗 这是一种与语言无关的方法 创建一个至少包含以下内容的数
  • 匹配括号内任何字符的正则表达式

    尝试创建一个与括号内的任何字符匹配的正则表达式 我的正则表达式模式是这样的 preg match listanswer answer 括号内的所有字符串都是匹配模式 但问题是 当我尝试匹配例如 this word sample data 它
  • 如何使用 PHP 动态插入 CSS 类?

    下面的代码有什么问题 我想在相应的情况下动态插入 当前 CSS 类 li 单击元素 谢谢 section section li
  • 如何销毁一个物体?

    据我所知 很少 有两种方法 var new object Then Method 1 Set to null var null Method 2 Unset unset var 还有其他更好的方法吗 我在这里吹毛求疵吗 您正在寻找unset
  • 获取目录中最后修改的文件

    有没有办法只选择目录中的最后一个文件 扩展名jpg png gif 或者我是否必须解析整个目录并使用进行检查filemtime 是的 你必须通读它们 但由于目录访问已被缓存 因此您不必真正担心它 files array merge glob
  • .htaccess 在动态文件夹名称中加载索引

    我在 htaccess 加载动态文件夹名称中的索引时遇到问题 这是我的目录结构 root products gt this is constant folder name 而不是使用 GET 获取产品 url root products i
  • 我的 PHP 代码不会将记录插入到 mySQL 数据库表中[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我的网站上
  • 返回上一页

    我正在使用表格来 评价 页面 此表单将数据 发布 到其他地方的 php 脚本 我只是想在处理表单后显示一个链接 这将使用户返回到上一页 我可以在 php 脚本中使用 javascript 来执行此操作吗 GF 您可以使用链接来调用histo
  • 从文本文件 PHP 读取数据

    我只是想知道如何在 php 中读取文本文件 我想让它显示文本文件中的最后 200 个条目 每个条目都在一个新行上 Like John White Jane Does John Does Someones Name 等等 Thanks Use
  • 如何使用多个数据库设置 symfony 3 学说迁移?

    我在验证和更新模式时努力让 symfony doctrine 排除数据库视图 我第一次尝试没有教条迁移 看到这个问题 https stackoverflow com questions 46775200 symfony 3 doctrine
  • PHP URL 验证

    我知道有无数的线程问这个问题 但我一直无法找到一个可以帮助我解决这个问题的线程 我基本上试图解析大约 10 000 000 个 URL 的列表 确保它们根据以下标准有效 然后获取根域 URL 此列表包含您能想象到的几乎所有内容 包括类似的内
  • 使用 Flot、html、PHP 和 MySql 查询绘制多个图表

    我正在尝试使用 Flot html PHP 和 MySql 查询绘制多个图表 但我陷入了困境 因为我找不到在同一个 html 页面中绘制多个 flot 的方法 为简单起见 在数据库 test db3 映像中包含以下字段 表1 用户名 发送邮
  • 如何编写可以补偿拼写错误数据的 MySQL 搜索?

    有没有什么方法可以编写一个 MySQL 搜索来弥补用户在拼写等方面的错误 作为随机示例 有人可能会输入 电子邮件受保护 cdn cgi l email protection代替 电子邮件受保护 cdn cgi l email protect
  • 通过 SOAP 的 Gmt php 或 UTC C# 等效项

    is C DateTime UtcNow和 PHPdate c 是等价的 我怀疑 因为当我肥皂时 我得到了 C
  • 如何在php中关闭夏令时

    我有这行代码将夏令时设置为 打开 将其设置为 关闭 的正确方法是什么 is daylight saving On rcmail config dst active bool date I date I 这是一个大写字母 i 当当前默认时区
  • 如何创建可以从任何控制器和刀片文件访问的全局函数

    我有两个控制器文件 homecontroller 和 backendcontroller 创建全局函数并从两个文件访问它的最佳方法是什么 I found here https stackoverflow com questions 3241
  • MYSQL 的 Google OAuth 2.0 用户 ID 数据类型

    我正在实施 Google OAuth 2 0 并注意到 Google OAuth 返回的唯一用户 ID 是21位数字长的 我想大整数 20 足以满足这种需求 但我现在看到 Google OAuth 返回的用户 ID 的长度感到困惑 关于我应

随机推荐