我试图了解将 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>();
请有人可以解释每种方法的优缺点(如果有的话),特别是在性能和内存使用方面。
我的公司一直在讨论类似情况的事情。我们最终考虑了以下因素。
使用Newtonsoft.JSON:
优点:
缺点:
使用System.Text.Json:
优点:
缺点:
对于大多数情况,System.Text.Json 应该足以反序列化 JSON 负载。然而,对于更复杂的 JSON 序列化/反序列化需求,Newtonsoft.JSON 可能仍然是首选。最终,如果您的项目有任何指导和限制,选择取决于项目的具体要求。
httpClient.GetFromJsonAsync<>()
:204 NoConent
(不确定他们现在是否修复了)。HttpRequestException
异常才能获取状态码。httpClient.GetStreamAsync()
获取底层流,然后执行 JsonSerializer.DeserializeAsync()
并在那里应用限制)。JsonSerializer.DeserializeAsyncEnumerable()
以获得更好的性能,因为列表中的每个项目的大小都很大并且需要时间来反序列化。优点: