当前位置: 首页 > 面试题库 >

使用JSON.NET将对象序列化为HttpClient的响应流

红朝
2023-03-14
问题内容

嗨,我正在一个项目中,需要通过HttpClient发送某个对象的潜在巨大json,典型大小是10-20
mb的JSON。为了有效地做到这一点,我想使用流,两者都通过Json.Net来序列化一个对象,另外还要使用流来使用HttpClient发布数据。

问题

这是使用Json.net进行序列化的代码段,为了使用流,Json.net希望它将写入其中:

public static void Serialize( object value, Stream writeOnlyStream )
{
    StreamWriter writer = new StreamWriter(writeOnlyStream);  <-- Here Json.net expects the stream to be already created
    JsonTextWriter jsonWriter = new JsonTextWriter(writer);
    JsonSerializer ser = new JsonSerializer();
    ser.Serialize(jsonWriter, value );
    jsonWriter.Flush();
}

虽然HttpClient期望从中读取的流:

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri("http://localhost:54359/");

    var response = await client.PostAsync("/api/snapshot", new StreamContent(readOnlyStream)); <-- The same thing here, HttpClient expects the stream already to exist

    ... 
}

因此,最终这意味着这两个类都期望Stream由其他人创建,但是Json.Net和HttpClient都没有流。因此,似乎可以通过实现一个流来解决该问题,该流将拦截对只读流的读取请求,并根据来自只写流的请求发出写入。

也许已经有人偶然发现了这种情况,并且可能已经找到解决该问题的方法。如果是这样,请与我分享,

先感谢您!


问题答案:

使用PushStreamContent。与其让Web API从流中“拉”,不如让它更直观地“推入”其中。

object value = ...;

PushStreamContent content = new PushStreamContent((stream, httpContent, transportContext) =>
{
    using (var tw = new StreamWriter(stream))
    {
        JsonSerializer ser = new JsonSerializer();
        ser.Serialize(tw, value);
    }
});

请注意,JSON.NET在序列化过程中不支持异步,因此虽然这可能会提高内存效率,但是扩展性却不高。

不过,我建议您尝试避免使用如此大的JSON对象。例如,如果您要通过一个大集合发送邮件,请尝试对其进行分块。如果没有特殊处理,许多客户/服务器都会拒绝这么大的东西。



 类似资料:
  • 问题内容: 我的JSON有点弱,所以我需要一些帮助。 我正在尝试反序列化用户的JSON: 放入我用属性装饰的对象中: 我得到以下异常: Newtonsoft.Json.JsonSerializationException:在JSON中找不到必需的属性’user_id’。 这是因为JSON对象是一个数组吗?如果是这样,如何将其反序列化为一个User对象? 提前致谢! 问题答案: 正如Alexandr

  • 问题内容: 我正在尝试对a进行序列化/反序列化,如果对象是简单类型,这似乎很好,但是当对象更复杂时,它不起作用。 我有这个课: 在我的字典中,我添加了一个带有“重定向链”键的键和一些带有“状态”,“网址”,“父网址”键的简单字符串。我从JSON.Net返回的字符串如下所示: 我用来序列化的代码如下: 反序列化我正在做的事情: 字典恢复正常,所有字符串恢复正常,但是列表未正确反序列化。它只是作为 当

  • 问题内容: 我有一个带有JSON数组的有效JSON对象。JSON数组没有花括号,并且包含逗号分隔的混合类型列表。看起来像这样: 我创建了一个反映JSON结构的类,为复杂数组提供了一个List: 我也用列表列表进行了测试: 子模型如下所示: 在我的program.cs文件中,我正在反序列化如下: 当我运行该程序时,子对象(Rows)始终为。我究竟做错了什么? 问题答案: Json.Net没有将数组自

  • 问题内容: 是否可以使用Json.NET 序列化为NDJSON(换行分隔的JSON)?Elasticsearch API使用NDJSON进行批量操作,我找不到任何暗示 任何 .NET库都支持此格式的信息。 这个答案提供指导反序列化NDJSON,并有人指出,一个能够独立序列每一行和新行加入,但我不一定会调用 支持 。 问题答案: false`](http://www.newtonsoft.com/j

  • 我在尝试“反序列化”对象时遇到以下错误: 我需要能够使用这个XStream库序列化/反序列化对象,甚至是那些没有参数构造函数的对象。

  • 问题内容: 我正在使用JSON.NET对对象进行序列化以连接到REST API。我对象中需要序列化为JSON的属性之一具有动态属性名称。如果此属性的struct中包含的值是数字值,则JSON属性为“ type_id”,但是,如果此值是字符串值,则JSON属性名称为“ type_code”。我尝试为此使用自定义,但是在尝试序列化时收到以下消息: “状态为Property的令牌PropertyName