JSON字符串(从大阵列编码的)得到了截断时输出到HTTP客户端(JSON string (enco

2019-10-20 08:05发布

我遇到了一个问题,JSON字符串输出到HTTP客户端被截断附近关闭标签。

一个例子,

一种。 希望看到 - ...... “LAST_UPDATE”: “2014年6月10日20时46分38秒”, “garden_id”: “1”}], “消息”:空}

湾 实际上它是 - ...... “LAST_UPDATE”: “2014年6月10日20点46分38秒”, “garden_id”: “1”}], “消息”:NUL

最后两个characaters被截断由于某种原因!

我试着在Chrome和卷曲邮差都在控制台上,所有相同的输出。 所以看起来不是一个浏览器的具体问题。 在我的应用程序的JSON字符串来自关联数组在PHP json_encode。 PHP代码是用在Apache上运行CodeIgniter的框架。 我试图JSON字符串写入HTTP输出前一个文件,文件内容是100%正确的。 因此,这不是一个PHP JSON编码问题。

PHP的是非常简单的。 我有以下构建从数据库查询阵列(即FinalData的$)

{
    "success": true,
    "data": [
        {
            "file_id": "1",
            "title": "xxx",
            "create_date": "2014-05-18 21:30:19",
            "auditor": "1",
            "status": "1",
            "last_updater": null,
            "last_update": "2014-06-10 20:43:14",
            "garden_id": "1"
        },
        {
            "file_id": "2",
            "title": "yyy",
            "create_date": "2014-05-18 21:30:19",
            "auditor": "1",
            "status": "1",
            "last_updater": null,
            "last_update": "2014-06-10 20:43:14",
            "garden_id": "1"
        }
    ],
    "message": null
}

“数据”有一个子阵列,它可能是一个漫长阵列依赖于数据库记录。 然后变量$ FinalData的被传递给具有低于一般逻辑输出功能:

header('Content-Type: '.$this->_supported_formats[$this->response->format]);
$output = $this->format->factory($finaldata)->{'to_'.$this->response->format}();
header('Content-Length: ' . strlen($output));

输出功能可以通过一个RESTful库建https://github.com/philsturgeon/codeigniter-restserver 。 在这种情况下,它等于

header('Content-Type: Application/json');
$output = json_encode($finaldata);

但是,我发现了一个有趣的事情,如果字符串长度超过8K的问题只发生。 而当我附上一个随机字符串,如“ZZZ”,以HTTP应答前,JSON字符串,这个问题就消失了。 我不知道背后的原因。 这是不正确的黑客,因为我无法证明8K是一个真正的门槛虽然。

有没有人遇到过这样的问题? 任何建议或意见赞赏。

Answer 1:

我想你在发送数据UTF-8字符集,从而试图改变这一行

header('Content-Type: '.$this->_supported_formats[$this->response->format]);
header('Content-Length: ' . strlen($output));

这个一个

header('Content-Type: '.$this->_supported_formats[$this->response->format] . '; charset=utf-8');
header('Content-Length: ' . mb_strlen($output));

如果这不只是工作不发送Content-Length在所有头。 这头是“唯一有用的”,如果你将文件发送到浏览器(下载)。



Answer 2:

在我的问题,我能够在nginx的gzip和附加application/json到gzip_types领域。 然后,我设置了头制作与狂饮的请求时。 看起来像

    if (! isset($parameters['headers'])) {
        $parameters['headers']['Accept-Encoding'] = 'gzip';
    }


文章来源: JSON string (encoded from large array) got truncated when output to HTTP client