我正在尝试从this Json Rest API获取数据,并使用ASP.NET MVC在View中显示。我按照this教程。
我收到错误消息“无法将当前JSON对象(例如{”name“:”value“})反序列化为类型'System.Collections.Generic.List`1 [diversity.Models.Species]',因为type需要JSON数组(例如[1,2,3])才能正确反序列化。 要修复此错误,请将JSON更改为JSON数组(例如[1,2,3])或更改反序列化类型,使其成为普通的.NET类型(例如,不是像整数这样的基本类型,而不是类似的集合类型可以从JSON对象反序列化的数组或List。 JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化。 路径'userId',第2行,第12位。'
我知道其他相关问题,例如this。但是,这表示将<List<Species>>
替换为<Species>
。如果我这样做,会导致视图中的@model IEnumerable<diversity.Models.Species>
出错。
我认为来自api的响应不是列表而是单个对象。 那么我该如何正确实现呢? 如果我将来必须获得一个列表,我应该如何更改代码?
这是我的代码。
SpeciesController.cs
using diversity.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using LinqToWiki.Download;
using LinqToWiki.Generated;
using LinqToWiki;
using System.Text;
using RestSharp;
using Newtonsoft.Json.Linq;
using System.Net.Http;
using Newtonsoft.Json;
namespace diversity.Controllers
{
public class SpeciesController : Controller
{
public async System.Threading.Tasks.Task<ActionResult> SpeciesDetails(){
HttpClient client = new HttpClient();
List<Species> datalist = new List<Species>();
try
{
HttpResponseMessage response = await client.GetAsync("https://jsonplaceholder.typicode.com/posts/1");
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
datalist = JsonConvert.DeserializeObject<List<Species>>(responseBody);
}
catch (HttpRequestException e)
{
System.Diagnostics.Debug.WriteLine("\nException Caught!");
System.Diagnostics.Debug.WriteLine("Message :{0} ", e.Message);
}
client.Dispose();
return View(datalist);
}
}
}
Species.cs(Model)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace diversity.Models
{
public class Species
{
public int UserId { get; set; }
public int Id { get; set; }
public string Title { get; set; }
public string Body { get; set; }
}
}
SpeciesDetails.cshtml
@model IEnumerable<diversity.Models.Species>
@{
ViewBag.Title = "SpeciesDetails";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>SpeciesDetails</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.UserId)
</th>
<th>
@Html.DisplayNameFor(model => model.Title)
</th>
<th>
@Html.DisplayNameFor(model => model.Body)
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.UserId)
</td>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.Body)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
@Html.ActionLink("Details", "Details", new { id=item.Id }) |
@Html.ActionLink("Delete", "Delete", new { id=item.Id })
</td>
</tr>
}
</table>