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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:07:24