如何将大型 JSON 对象直接序列化为 HttpResponseMessage 流?

Posted

技术标签:

【中文标题】如何将大型 JSON 对象直接序列化为 HttpResponseMessage 流?【英文标题】:How to serialize a large JSON object directly to HttpResponseMessage stream? 【发布时间】:2016-09-06 18:28:04 【问题描述】:

有没有办法将大型 JSON 对象直接流式传输到 HttpResponseMessage 流?

这是我现有的代码:

        Dictionary<string,string> hugeObject = new Dictionary<string,string>();
        // fill with 100,000 key/values.  Each string is 32 chars.
        HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
        response.Content = new StringContent(
            content: JsonConvert.SerializeObject(hugeObject),
            encoding: Encoding.UTF8,
            mediaType: "application/json");

这适用于较小的对象。但是,调用 JsonConvert.SerializeObject() 将对象转换为字符串的过程会导致大对象的内存峰值出现问题。

我想做相当于what's described here for deserialization。

【问题讨论】:

你能发布你的大对象的结构吗? 添加了hugeObject的示例... 您是否尝试过您链接的页面上的Manual Serialization 部分? @krillgar 看起来很有希望,但我不知道该写什么。我可以为响应创建一个 StreamContent HttpContent,但我必须提供流。 使用关注点分离,我会创建一个类,如JsonConvert 来处理转换过程。您应该为您的每个对象添加一个方法,如果您有它们可用于将该对象写入流。如果你正在研究Dictionary&lt;string, string&gt; 之类的东西,那么你显然没有这种能力,并且可以将其封装在新类中。 【参考方案1】:

您可以尝试使用PushStreamContent 并使用JsonTextWriter 写信给它:

HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new PushStreamContent((stream, content, context) =>

    using (StreamWriter sw = new StreamWriter(stream, Encoding.UTF8))
    using (JsonTextWriter jtw = new JsonTextWriter(sw))
    
        JsonSerializer ser = new JsonSerializer();
        ser.Serialize(jtw, hugeObject);
    
, "application/json");

【讨论】:

以上是关于如何将大型 JSON 对象直接序列化为 HttpResponseMessage 流?的主要内容,如果未能解决你的问题,请参考以下文章

如何将属性序列化为 json 对象?

如何将表行序列化为 json 对象

如何使用 Json.NET 将 XML 序列化为 JSON 对象

如何将java对象序列化/反序列化为javax.JSON

JavaScriptSerializer类 对象序列化为JSON,JSON反序列化为对象

如何将对象的json数组反序列化为字典[重复]