gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:42:58 29 4
gpt4 key购买 nike

我正在开发 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 数组被传递给一个被分派(dispatch)的作业:
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 被执行。
我试图解决这个问题,但没有成功:
  • 应用 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]) : '',
    ];
    }
    }
    ...它 工作 (没有错误,无论是否有 ÿ ),但是希腊和西里尔字母变成了问号。例如,这个: Εθνικής 将变成 ???????
    我也尝试过 mb_convert_encoding($row[1], 'utf-8') - 它不会将希腊或西里尔字母变成问号,但是这个 ÿ 字符将变成 ?
  • 将上传的 CSV 文件的“处理”(转换为数组)移动到工作类的 @handle 方法中,但随后我无法将该数组中的数据存储到 DB(MongoDB)中。请参阅下面的更新。

  • 调试:
    这是我从 dd($contacts); 得到的:
    enter image description here
    所以,它有 ÿ 所在的“b”。而且,经过一些“谷歌搜索”,我发现这个“b”的意思是“二进制字符串”,即一个非 unicode 字符串,函数在字节级别( What does the b in front of string literals do? )上运行。
    我的理解是:在调度 Job 类时,Laravel 尝试对其进行“JSON 编码”(传递的参数/数据),但由于存在二进制数据(非 unicode 字符串)而失败。
    无论如何,我找不到解决方案(能够使用 ÿ 处理此类 CSV 文件)。
    我在用:
  • Laravel 5.7
  • PHP 7.1.31-1+ubuntu16.04.1+deb.sury.org+1(cli)(构建时间:2019 年 8 月 7 日 10:22:48)(NTS)
  • Redis 供电队列

  • 更新
    当我将上传的 CSV 文件的“处理”(转换为数组)移动到 Job 类的 @handle 方法时 - 我没有收到此错误( Unable to JSON encode payload. Error code: 5 ),但是当我尝试使用 ÿ ( b"Richardÿ" )将有问题的二进制数据存储到MongoDB - 它失败了。奇怪的是,我在日志文件中没有收到任何错误异常 消息 ,所以我把所有的都放在 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]);
    }

    第二种方法是使用 this answer 中概述的第三方库。

    关于php - Laravel:无法对​​有效负载进行 JSON 编码。错误代码:5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58806339/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com