You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过HTTP以原生JSON而非字符串形式发送RapidJSON::Document

RapidJSON 直接输出到HTTP流的实现方案

首先明确:HTTP协议传输的负载均为字节序列,不存在直接传输Document内存对象的可能,你提到的「不发送序列化字符串」通常是指避免先生成完整的序列化std::string再拷贝到HTTP缓冲区的冗余操作,RapidJSON本身支持自定义输出流,可以直接将DOM序列化到HTTP的输出缓冲区,无需中间字符串存储。

核心实现逻辑

  • RapidJSON的Writer/PrettyWriter组件不强制绑定StringBuffer,只要实现符合RapidJSON要求的OutputStream接口,就可以直接对接HTTP库的写入方法,全程无冗余内存拷贝。

实现示例

1. 自定义HTTP输出流适配类

假设你使用的HTTP库提供了http_resp_write(const char* buf, size_t len)的响应写入接口,自定义流实现如下:

#include <rapidjson/document.h>
#include <rapidjson/writer.h>

using namespace rapidjson;

class HttpRespOutputStream {
public:
    // RapidJSON要求必须实现的单字符写入方法
    void Put(char c) {
        http_resp_write(&c, 1);
    }
    // 可选实现的批量写入方法,可大幅提升序列化性能
    void Put(const char* str, size_t length) {
        http_resp_write(str, length);
    }
    // 可选实现的刷新方法,按需对接HTTP库的缓冲区刷新逻辑
    void Flush() {}
};

2. 直接序列化DOM到HTTP响应

// 你已构造完成的Document对象
Document doc;
doc.SetObject();
Value msg("request success", doc.GetAllocator());
doc.AddMember("code", 200, doc.GetAllocator());
doc.AddMember("msg", msg, doc.GetAllocator());

// 直接序列化到HTTP响应,无中间序列化字符串生成
HttpRespOutputStream os;
Writer<HttpRespOutputStream> writer(os);
doc.Accept(writer);

不同HTTP库适配注意点

  • 若使用C++生态的HTTP库(如Boost.Beast、Poco、CppRestSDK等),只需要将自定义流的Put方法对接对应库响应对象的body写入接口即可。
  • 若需要做GZIP等压缩传输,可在自定义流内部先写入压缩缓冲区,达到阈值后再刷入HTTP响应,进一步降低内存占用。

内容的提问来源于stack exchange,提问作者yushizhao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 19:27:03