我正在尝试找到有关如何从 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 序列化库,并且由于您没有指定它,我能做的事情是有限的,对于其他问题,请尝试给出尽可能多的信息
如果您使用
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