You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否直接从Stream反序列化Web API的JSON响应至自定义对象?

直接从Stream反序列化Web API的JSON响应到自定义对象

编译错误原因

出现cannot convert from 'System.IO.Stream' to 'Newtonsoft.Json.JsonReader'错误,是因为混用了不同JSON序列化库的API:代码中可能同时引用了.NET内置的System.Text.Json和第三方的Newtonsoft.Json(Json.NET),导致调用的JsonSerializer.Deserialize方法与传入的Stream参数不匹配。

解决方案:直接从Stream反序列化(无需转字符串)

直接从Stream反序列化是完全可行的,而且比先转成字符串更节省内存(尤其适合大体积响应),以下是两种主流JSON库的正确写法:

1. 使用.NET内置System.Text.Json

确保代码引入对应命名空间:

using System.Text.Json;

修改反序列化代码为异步版本(Stream读取为异步操作,对应DeserializeAsync方法):

if (response.IsSuccessStatusCode)
{
    using var responseStream = await response.Content.ReadAsStreamAsync();
    var responseData = await JsonSerializer.DeserializeAsync<List<CompanyVM>>(responseStream);
}

若需自定义序列化规则(如忽略属性大小写、空值),可传入JsonSerializerOptions:

var options = new JsonSerializerOptions
{
    PropertyNameCaseInsensitive = true,
    IgnoreNullValues = true
};
var responseData = await JsonSerializer.DeserializeAsync<List<CompanyVM>>(responseStream, options);

2. 使用Newtonsoft.Json(Json.NET)

确保代码引入对应命名空间:

using Newtonsoft.Json;

可通过JsonConvert.DeserializeObjectAsync直接处理Stream:

if (response.IsSuccessStatusCode)
{
    using var responseStream = await response.Content.ReadAsStreamAsync();
    var responseData = await JsonConvert.DeserializeObjectAsync<List<CompanyVM>>(responseStream);
}

也可手动创建JsonTextReader处理Stream:

if (response.IsSuccessStatusCode)
{
    using var responseStream = await response.Content.ReadAsStreamAsync();
    using var streamReader = new StreamReader(responseStream);
    using var jsonReader = new JsonTextReader(streamReader);
    var responseData = JsonSerializer.CreateDefault().Deserialize<List<CompanyVM>>(jsonReader);
}

总结

不需要先将Stream读取为字符串再反序列化,直接操作Stream是更高效的方式。核心是统一使用同一JSON库的API,避免混用System.Text.Json和Newtonsoft.Json的方法。

内容的提问来源于stack exchange,提问作者Sebastian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 17:50:34