跳到正文
Yayin Story Studio Yayin Story Studio 项目文档

Visindigo::Network::JsonLinesDecoder Class

class Visindigo::Network::JsonLinesDecoder

NDJSON(JSON Lines)流解码器. 详情...

头文件: #include <Network/HttpRequest.h>
自以下版本: Visindigo 0.17.0
继承自: Visindigo::Network::IStreamDecoder

重实现的公开成员函数

(自 Visindigo 0.17.0 引入) virtual QList<Visindigo::Network::StreamFrame> feed(const QByteArray &chunk) override
(自 Visindigo 0.17.0 引入) virtual QList<Visindigo::Network::StreamFrame> finish() override
(自 Visindigo 0.17.0 引入) virtual qint64 getBufferedBytes() const override
(自 Visindigo 0.17.0 引入) virtual qint64 getMaxFrameBytes() const override
(自 Visindigo 0.17.0 引入) virtual void reset() override
(自 Visindigo 0.17.0 引入) virtual void setMaxFrameBytes(qint64 bytes) override

详细说明

以换行符分帧,每一行构成一个完整帧,帧的 StreamFrame::Data 即该行内容 (不含换行),StreamFrame::EventStreamFrame::Id 恒为空。 空行被跳过,行尾的 \\r 会被剥除,因此 Windows 与 Unix 换行都能正确处理。

这一格式常见于本地推理服务与事件推送接口,典型用法是把它挂到请求上:

request.setStreamDecoder(std::make_shared<JsonLinesDecoder>());
center->request(request)->onFrame(this, [](const StreamFrame& frame) {
        // frame.Data 是一行 JSON
        return true;
});

Note: 本类只负责切分,不解析 JSON。行内容是否合法由调用方判断, 这样解码器无需关心负载语义,也不会因为 JSON 库的选择而影响接口。

Note: 当累计缓冲超过 setMaxFrameBytes 设定的上限仍未见换行时, 超限部分会被丢弃,以避免无换行的响应把内存吃光。

成员函数文档

[override virtual, since Visindigo 0.17.0] QList<Visindigo::Network::StreamFrame> JsonLinesDecoder::feed(const QByteArray &chunk)

Reimplements: IStreamDecoder::feed(const QByteArray &chunk).

送入新增字节,返回本次能够完整切出的所有帧。未以换行结尾的残余部分 会被保留到下次调用,因此调用方无需关心网络分包的位置。

chunk 新到达的字节,其边界没有任何语义。

这个function 从 Visindigo 0.17.0 开始支持。

[override virtual, since Visindigo 0.17.0] QList<Visindigo::Network::StreamFrame> JsonLinesDecoder::finish()

Reimplements: IStreamDecoder::finish().

流结束时调用。若缓冲区还剩下未以换行结尾的内容,它会被当作最后一个帧返回; 这是必要的,因为服务端完全可以在最后一行的末尾省略换行。

这个function 从 Visindigo 0.17.0 开始支持。

[override virtual, since Visindigo 0.17.0] qint64 JsonLinesDecoder::getBufferedBytes() const

Reimplements: IStreamDecoder::getBufferedBytes() const.

返回尚未切分成帧的字节数。

这个function 从 Visindigo 0.17.0 开始支持。

[override virtual, since Visindigo 0.17.0] qint64 JsonLinesDecoder::getMaxFrameBytes() const

Reimplements: IStreamDecoder::getMaxFrameBytes() const.

返回当前的单帧缓冲上限。

这个function 从 Visindigo 0.17.0 开始支持。

[override virtual, since Visindigo 0.17.0] void JsonLinesDecoder::reset()

Reimplements: IStreamDecoder::reset().

清空内部缓冲,使解码器回到初始状态。重试或重定向后会调用它, 以便下一跳的字节从头开始分帧。

这个function 从 Visindigo 0.17.0 开始支持。

[override virtual, since Visindigo 0.17.0] void JsonLinesDecoder::setMaxFrameBytes(qint64 bytes)

Reimplements: IStreamDecoder::setMaxFrameBytes(qint64 bytes).

设置单帧缓冲上限,默认 1 MiB。请参阅类说明中关于超限行为的解释。

bytes 单帧缓冲上限,单位为字节。

这个function 从 Visindigo 0.17.0 开始支持。