C# 在传输 HTTP 响应 JSON 时反序列化

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

我正在尝试找到有关如何从 http 响应中反序列化 JSON 数据的清晰文档。我正在使用

HttpClient
,如下所示:

using var client = new HttpClient(mySocketsHttpHandler);
// auth setup e.t.c....
var response = await client.GetAsync(url);
// get data from response message

当前使用 bog 标准方式读取 JSON(使用 Newtonsoft):

var json = await response.Content.ReadAsStringAsync();
var niceObject = JsonConvert.DeserializeObject<MyNiceObject>(json);

效果很好,但在某些情况下结果特别大(超过 LOH 的 85kb 限制,有时很多)。我正在尝试优化,并希望反序列化来自请求的 JSON。

HttpResponse
HttpClient
似乎有点黑匣子,目前我正在尝试:

await using var stream = response.Content.ReadAsStreamAsync();
using var sr = new StreamReader(stream);
using var reader = new JsonTextReader(sr);
var serializer = new JsonSerializer();
var niceObject = serializer.Deserialize<MyNiceObject>(reader);

这个想法是避免分配字符串变量,最好是缓冲响应的部分,因为它进入了 JSON 读取器。也是这样的:

  • 实际上是在解析传入的 JSON 吗?或者它会阻塞直到响应完成并且流完全分配?
  • 是否可以从写入的流中解析 JSON?
  • 如果这根本不是正确的方法,那么哪种方法是资源密集程度最低的方法?
c# json stream httpresponse
1个回答
0
投票

这取决于您正在使用的 Json 序列化库,并且由于您没有指定它,我能做的事情是有限的,对于其他问题,请尝试给出尽可能多的信息

如果您使用

System.Text.Json
,它确实提供了一种直接从流中反序列化数据的方法

var responseStream = await HttpClient.GetStreamAsync(apiurl);
var release = await JsonSerializer.DeserializeAsync<Release>(responseStream);

如果你想做验证或类似的事情,你也可以先做

HttpResponseMessage

var response = await HttpClient.GetAsync(apiurl);

if (response.IsSuccessStatusCode)
{
    // sample validations here
}

var responseContent = await response.Content.ReadAsStreamAsync();
var release = await JsonSerializer.DeserializeAsync<Release>(responseContent);

如果您好奇,可以在此处检查所有重载System.Text.Json JsonSerializer Class

© www.soinside.com 2019 - 2024. All rights reserved.