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

佩拉·米卡

我正在使用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. 申请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]) : '',
            ];
        }
    }

...并且可以正常工作(没有错误,无论是否存在ÿ),但是希腊字母和西里尔字母变成了问号。例如,this:Εθνικής将变为???????

我也尝试过mb_convert_encoding($row[1], 'utf-8')-并不会将希腊字母或西里尔字母变成问号,但此ÿ字符将变为?

  1. 将已上载的CSV文件的“处理”(转换为数组)移动到@handleJob类的方法中,但是,之后我无法将该数组中的数据存储到DB(MongoDB)中。请参阅下面的更新。

调试:

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

在此处输入图片说明

因此,它的“ b”在哪里ÿ并且,在进行一些“搜索”之后,我发现此“ b”表示“二进制字符串”,即非unicode字符串,在该字符串上,函数在字节级别上操作(字符串文字前面的b做什么?)。

我了解的是:调度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文件的“处理”(转换为数组)移动到@handleJob类的方法中时-我没有收到此错误(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());
        }

...这是结果:

在此处输入图片说明

无论如何,我认为它由于导致失败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]);
}

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从异常策略返回json编码的有效负载

来自分类Dev

TweepError:无法解析JSON有效负载:

来自分类Dev

TweepError:无法解析JSON有效负载:

来自分类Dev

任务队列REST API-无效值错误-有效负载base64编码

来自分类Dev

维护Java中错误代码列表的最有效方法

来自分类Dev

如果程序有效,如何显示OpenCL错误代码-44 CL_INVALID_PROGRAM?

来自分类Dev

维护Java中错误代码列表的最有效方法

来自分类Dev

有效负载无效的JSON

来自分类Dev

JSON有效负载的Jsonpath

来自分类Dev

找不到编码音频的RTP有效负载

来自分类Dev

在GWT RPC调用中编码请求有效负载

来自分类Dev

Firebase云功能部署错误-HTTP错误:400,接收到无效的JSON有效负载

来自分类Dev

Golang:带有JSON有效负载的http.NewRequest POST返回错误500

来自分类Dev

在连接t时出现错误“无法解析STOMP中的TextMessage有效负载= [CONNECT”

来自分类Dev

SageMaker:调用InvokeEndpoint操作时发生错误(ModelError):无法评估提供的有效负载

来自分类Dev

解析GitHub WebHook有效负载导致Json解码错误

来自分类Dev

对 Bitbucket Server 进行 REST API 调用并尝试传递 JSON 有效负载会导致错误

来自分类Dev

Microsoft Graph API One Drive无法读取JSON请求有效负载

来自分类Dev

AspNetCore WebApi ODataController无法反序列化JSON有效负载

来自分类Dev

Microsoft Graph API One Drive无法读取JSON请求有效负载

来自分类Dev

错误代码:-5,莱特币私钥的私钥编码无效

来自分类Dev

用于部分有效负载的RESTful服务响应代码

来自分类Dev

如何在 Faraday (Rails 5) 中加密 JSON 有效负载

来自分类Dev

有效载荷损坏(校验和失败)最合适的HTTP错误代码是什么?

来自分类Dev

在Django过滤器或中间件中构建有效的错误代码映射器?

来自分类Dev

在Ember中标准化错误有效负载

来自分类Dev

Spring集成-包括错误中的有效负载

来自分类Dev

LambdaMessageProcessor无法识别ConversionService的有效负载类型

来自分类Dev

javascript 代码有效,但出现错误

Related 相关文章

  1. 1

    从异常策略返回json编码的有效负载

  2. 2

    TweepError:无法解析JSON有效负载:

  3. 3

    TweepError:无法解析JSON有效负载:

  4. 4

    任务队列REST API-无效值错误-有效负载base64编码

  5. 5

    维护Java中错误代码列表的最有效方法

  6. 6

    如果程序有效,如何显示OpenCL错误代码-44 CL_INVALID_PROGRAM?

  7. 7

    维护Java中错误代码列表的最有效方法

  8. 8

    有效负载无效的JSON

  9. 9

    JSON有效负载的Jsonpath

  10. 10

    找不到编码音频的RTP有效负载

  11. 11

    在GWT RPC调用中编码请求有效负载

  12. 12

    Firebase云功能部署错误-HTTP错误:400,接收到无效的JSON有效负载

  13. 13

    Golang:带有JSON有效负载的http.NewRequest POST返回错误500

  14. 14

    在连接t时出现错误“无法解析STOMP中的TextMessage有效负载= [CONNECT”

  15. 15

    SageMaker:调用InvokeEndpoint操作时发生错误(ModelError):无法评估提供的有效负载

  16. 16

    解析GitHub WebHook有效负载导致Json解码错误

  17. 17

    对 Bitbucket Server 进行 REST API 调用并尝试传递 JSON 有效负载会导致错误

  18. 18

    Microsoft Graph API One Drive无法读取JSON请求有效负载

  19. 19

    AspNetCore WebApi ODataController无法反序列化JSON有效负载

  20. 20

    Microsoft Graph API One Drive无法读取JSON请求有效负载

  21. 21

    错误代码:-5,莱特币私钥的私钥编码无效

  22. 22

    用于部分有效负载的RESTful服务响应代码

  23. 23

    如何在 Faraday (Rails 5) 中加密 JSON 有效负载

  24. 24

    有效载荷损坏(校验和失败)最合适的HTTP错误代码是什么?

  25. 25

    在Django过滤器或中间件中构建有效的错误代码映射器?

  26. 26

    在Ember中标准化错误有效负载

  27. 27

    Spring集成-包括错误中的有效负载

  28. 28

    LambdaMessageProcessor无法识别ConversionService的有效负载类型

  29. 29

    javascript 代码有效,但出现错误

热门标签

归档