我正在尝试使用 .NET 显示响应并将其映射到来自 Unirest 的类。我在堆栈上遵循了此示例:使用 Unirest C# 将 http 响应正文转换为 JSON 格式
但是,在运行它时,我收到错误"无法将类型'System.IO.MemoryStream'的对象转换为类型'根对象'。
我的代码:
protected void Button1_Click(object sender, EventArgs e)
{
HttpResponse<JobSearchFeed.RootObject> jsonResponse = Unirest.get("http://api.indeed.com/ads/apisearch?publisher=PUBLISHER_KEY&v=2&l=California&q=javascript")
.header("X-Mashape-Key", "MY_KEY")
.header("Accept", "application/json")
.asJson<JobSearchFeed.RootObject>();
}
我还环顾四周,发现我需要将其用作"任务",但我不确定这是否捕获了任何数据。
我的代码:
static async Task<JobSearchFeed.RootObject> GetRootInfo()
{
HttpResponse<JobSearchFeed.RootObject> jsonResponse = await Unirest.get("http://api.indeed.com/ads/apisearch?publisher=PUBLISHER_KEY&v=2&l=California&q=javascript")
.header("X-Mashape-Key", "MY_KEY")
.header("Accept", "application/json")
.asJsonAsync<JobSearchFeed.RootObject>();
return jsonResponse.Body;
}
我的班级:
public class JobSearchFeed
{
public class Result
{
public string jobtitle { get; set; }
public string company { get; set; }
public string city { get; set; }
public string state { get; set; }
public string country { get; set; }
public string language { get; set; }
public string formattedLocation { get; set; }
public string source { get; set; }
public string date { get; set; }
public string snippet { get; set; }
public string url { get; set; }
public string onmousedown { get; set; }
public string jobkey { get; set; }
public bool sponsored { get; set; }
public bool expired { get; set; }
public bool indeedApply { get; set; }
public string formattedLocationFull { get; set; }
public string formattedRelativeTime { get; set; }
public string stations { get; set; }
}
public class RootObject
{
public int version { get; set; }
public string query { get; set; }
public string location { get; set; }
public string paginationPayload { get; set; }
public int radius { get; set; }
public bool dupefilter { get; set; }
public bool highlight { get; set; }
public int totalResults { get; set; }
public int start { get; set; }
public int end { get; set; }
public int pageNumber { get; set; }
public List<Result> results { get; set; }
}
}
答案很难,因为项目不容易遵循。让我按照解决方案:
- NuGet 包相当旧,它针对旧的 NET Framework 4.0 - NET Framework 与 4.0 相比几乎没有变化。我不知道你使用的是哪个目标,但我确定是较新的目标。检查所有规格的 https://www.nuget.org/packages/Unirest-API/。
- 如果我们检查源项目,则有 3 个,很难说哪个是正确的:https://github.com/zeeshanejaz/unirest-net、https://github.com/apimatic/unirest-net 或 https://github.com/Kong/unirest-net。因为 nuget 的作者我怀疑第一个,但项目网站指向第二个的 githubraw。
- 当我们使用 pdb 调试原始程序集时,源代码无法绑定到关键路径中,这意味着出了问题。
- 如果我们将源代码从第二个复制到项目中,它可以工作
我建议如下:
- 将库的源代码复制到您的项目中 - 库很小,直到 2015 年才更新,所以这应该不是一个大问题
- 而不是使用不支持的库,而是使用HttpClient和JsonConvert自己做。这对你来说完全一样,你跳过了问题
有问题的行 - 代码不知何故进入了这种情况并试图错误地强制转换对象:
else if (typeof (Stream).GetType().IsAssignableFrom(typeof (T).GetType()))
{
this.Body = (T) this.Raw;
}