无法将当前JSON对象(例如{“name”:“value”})反序列化为ASP.NET MVC中的类型'System.Collections.Generic.List`1

时间:2018-06-17 09:24:20

标签: c# json asp.net-mvc

我正在尝试从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>

0 个答案:

没有答案