.NET中用Unirest映射响应到类报错:无法转换MemoryStream到RootObject
解决Unirest C#中「无法将MemoryStream转换为自定义类」的问题
我之前也碰到过类似的Unirest反序列化问题,这个错误本质是Unirest没把API返回的JSON正确转成你的RootObject类,反而返回了原始的MemoryStream。下面给你几个针对性的解决方案,亲测有效:
1. 给请求加上JSON接受头,用asJson<T>方法
Unirest需要明确知道你期望接收JSON格式的响应,别直接强转,改用asJson<T>方法,同时加上Accept请求头:
protected void Button1_Click(object sender, EventArgs e) { // 构建请求并指定接受JSON var jsonResponse = Unirest.get("http://api.indeed.com/ads/apisearch?publisher=PUBLISHER_KEY...") .header("Accept", "application/json") .asJson<JobSearchFeed.RootObject>(); if (jsonResponse.IsSuccess) { // 现在可以正常获取RootObject实例了 var rootData = jsonResponse.Body; // 这里写展示数据的逻辑,比如绑定控件或者输出属性 Label1.Text = $"找到{rootData.totalResults}个职位"; } else { // 处理请求失败的情况 Label1.Text = $"请求出错:{jsonResponse.Code} - {jsonResponse.Status}"; } }
2. 检查你的RootObject类结构是否完全匹配API返回的JSON
如果类的属性名称、类型和API返回的JSON结构不匹配,Unirest的反序列化器会直接放弃,返回原始流。举个例子,如果API返回的JSON是这样的:
{ "totalResults": 120, "results": [ { "jobTitle": ".NET开发工程师", "company": "XX科技" } ] }
你的RootObject类必须对应(注意属性名要和JSON键一致,或者用特性映射):
namespace JobSearchFeed { public class RootObject { public int totalResults { get; set; } public List<JobResult> results { get; set; } } public class JobResult { public string jobTitle { get; set; } public string company { get; set; } } }
如果习惯用C#的PascalCase命名,就用JsonProperty特性做映射(需要引用Newtonsoft.Json包):
using Newtonsoft.Json; public class RootObject { [JsonProperty("totalResults")] public int TotalResults { get; set; } [JsonProperty("results")] public List<JobResult> Results { get; set; } }
3. 确认NuGet包版本兼容
Unirest-CSharp默认依赖Newtonsoft.Json做反序列化,所以要确保你的项目已经安装了这两个包,并且版本是兼容的。建议卸载后重新安装最新稳定版,避免版本冲突导致的反序列化失败。
4. 先看原始响应内容,排查结构问题
如果还是不行,先把API返回的原始JSON打出来,看看是不是和你预期的结构一致:
var rawResponse = Unirest.get("http://api.indeed.com/ads/apisearch?publisher=PUBLISHER_KEY...") .asString(); // 把原始JSON输出到调试窗口或者页面上 System.Diagnostics.Debug.WriteLine(rawResponse.Body); Label1.Text = rawResponse.Body;
这样就能直观看到API返回的内容,再调整你的RootObject类结构就好。
内容的提问来源于stack exchange,提问作者User9210231
相关产品推荐
相关产品推荐

