使用 ASP.NET MVC 使用 Web API 时出错 - "Cannot deserialize the current JSON object"



我正在使用Web API,但在序列化时,我得到了以下错误:

无法将当前JSON对象(例如,{"名称"值"}(反序列化为类型"System.Collections.Generic.List`1[neneneba Covidneneneea.Models.RegionsModel]",因为该类型需要JSON数组(例如[1,2,3](才能正确反序列化
若要修复此错误,请将JSON更改为JSON数组(例如[1,2,3](或更改反序列化的类型,使其成为可以从JSON对象反序列化的普通.NET类型(例如,不是像integer这样的基元类型,也不是像array或List这样的集合类型(。JsonObjectAttribute也可以添加到类型中,以强制它从JSON对象反序列化。路径"data",第1行,位置8。

我阅读了一些可能的解决方案,这些问题已经被提出,但无法发挥作用。

JSON.NET将对象反序列化为对象列表

无法反序列化当前JSON对象(例如{"name"值}(

如果你能帮我的话,我已经试了三天了,但我解决不了。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
using System.Net.Http;
using Covid.Models;
using System.Net.Http.Headers;
using Newtonsoft.Json;
namespace Covid.Controllers
{
public class HomeController : Controller
{
string Baseurl = "https://covid-19-statistics.p.rapidapi.com/regions";
public async Task<ActionResult> Index()
{
try
{
List<RegionsModel> region = new List<RegionsModel>();
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(Baseurl);
client.DefaultRequestHeaders.Add("x-rapidapi-key", "32ac4c9518msh7fb8f6c7a05eb7bp1178dbjsn193f09c779d6");
client.DefaultRequestHeaders.Add("x-rapidapi-host", "covid-19-statistics.p.rapidapi.com");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage Res = await client.GetAsync("regions");
if (Res.IsSuccessStatusCode)
{
var response = Res.Content.ReadAsStringAsync().Result;
//var ObjMovmientos = JsonConvert.DeserializeObject<List<RegionsModel>>(response);
var objResponse1 = JsonConvert.DeserializeObject<List<RegionsModel>>(response);
region = objResponse1;
}
return View(region);
}
}
catch (Exception ex)
{
throw ex;
}          
}
}
}

型号类别为:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Covid.Models
{
public class RegionsModel
{
public RegionModel[] data { get; set; }  
public class RegionModel
{
[JsonProperty("iso")]
public string Iso { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
}
}
}

JSON是:

{
"data": [
{
"iso": "CHN",
"name": "China"
},
{
"iso": "TWN",
"name": "Taipei and environs"
},
{
"iso": "USA",
"name": "US"
},
{
"iso": "JPN",
"name": "Japan"
},
{
"iso": "WSM",
"name": "Samoa"
}
]
}

RegionsModel已经包含一个定义数组的属性,所以这是错误的:

var objResponse1 = JsonConvert.DeserializeObject<List<RegionsModel>>(response);

应该是:

var objResponse1 = JsonConvert.DeserializeObject<RegionsModel>(response);

此外,您的方法已经是异步的。因此,取而代之的是:

var response = Res.Content.ReadAsStringAsync().Result;

这样做:

var response = await Res.Content.ReadAsStringAsync();

最后,改变这个:

List<RegionsModel> region = new List<RegionsModel>();
// ...
region = objResponse1;

对此:

List<RegionModel> region = new List<RegionModel>();
// ...
region = objResponse1.data.ToList();

更改此行,

var objResponse1 = JsonConvert.DeserializeObject<List<RegionsModel>>(response);

var objResponse1 = JsonConvert.DeserializeObject<RegionsModel>(response);

原因是您的json是一个对象,数据,它有一个对象数组。。。

相关内容

最新更新