如何通过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
相关产品推荐
相关产品推荐

