能否直接从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
相关产品推荐
相关产品推荐

