从 httpClient 响应反序列化 JSON 的推荐方法

问题描述 投票:0回答:2

我试图了解将 JSON 解析为对象的推荐方法,特别是来自 httpClient 响应的方法(但我的问题也可能与从流中解析 JSON 相关)

我在互联网上搜索了许多博客文章,这就是我得出的结论:

我知道将流解析为字符串,然后将字符串解析为对象在内存使用方面是一个很大的禁忌。 根据许多博客文章,我遇到过传统的做法,即或曾经使用流,使用 Newtonsoft.JSON 包,如下所示:

using var streamReader = new StreamReader(stream);
using var jsonTextReader = new JsonTextReader(streamReader);
var myDeserializedObject = new JsonSerializer().Deserialize<MyObject>(jsonTextReader);

但是后来我遇到了另一种方法: 如果您使用 .NET Core 3 及更高版本(不太确定版本),您有一种使用 System.Text.JSON 反序列化流的内置方法:

var myDeserializedObject = await JsonSerializer.DeserializeAsync<MyObject>(stream);

尤其是 httpClient 请求(如果您使用的是 .NET 5 及更高版本,如果我没记错的话) 你可以这样做:

var myDeserializedObject = httpClient.GetFromJsonAsync<MyObject>();

请有人可以解释每种方法的优缺点(如果有的话),特别是在性能和内存使用方面。

json performance serialization stream httpclient
2个回答
0
投票

我的公司一直在讨论类似情况的事情。我们最终考虑了以下因素。

使用Newtonsoft.JSON:

优点:

  • 一个广泛使用的库,具有很多功能,包括序列化和反序列化 JSON。
  • 提供对序列化和反序列化过程的良好控制。

缺点:

  • 由于 JSON 流的字符串转换,可能会消耗更多内存。
  • 序列化和反序列化大型 JSON 有效负载时可能会产生性能开销。

使用System.Text.Json:

优点:

  • 内置并针对 .NET Core 3 及更高版本的性能进行了优化。
  • 与 Newtonsoft.JSON 相比,消耗更少的内存。
  • 与 Newtonsoft.JSON 相比,性能有所提高。

缺点:

  • 用于自定义序列化和反序列化过程的选项有限。
  • 可能不具备 Newtonsoft.JSON 中可用的所有功能。

对于大多数情况,System.Text.Json 应该足以反序列化 JSON 负载。然而,对于更复杂的 JSON 序列化/反序列化需求,Newtonsoft.JSON 可能仍然是首选。最终,如果您的项目有任何指导和限制,选择取决于项目的具体要求。


0
投票

httpClient.GetFromJsonAsync<>()

缺点:

  • 不支持
    204 NoConent
    (不确定他们现在是否修复了)。
  • 更重要的是,如果调用过程中发生任何错误,您必须处理
    HttpRequestException
    异常才能获取状态码。
  • 需要一些黑客方式来对 API 调用进行更多控制(例如,要限制读取器流缓冲区,您应该使用
    httpClient.GetStreamAsync()
    获取底层流,然后执行
    JsonSerializer.DeserializeAsync()
    并在那里应用限制)。
  • 您无法奢侈地返回
    JsonSerializer.DeserializeAsyncEnumerable()
    以获得更好的性能,因为列表中的每个项目的大小都很大并且需要时间来反序列化。
  • 同时进行 API 调用和反序列化,这完全违反了单一职责原则。

优点:

  • 这是一种非常简单的 API 调用方式。
© www.soinside.com 2019 - 2024. All rights reserved.