.net JSON未正确反序列化Web API

.net JSON未正确反序列化Web API,.net,json,entity-framework,asp.net-web-api,.net,Json,Entity Framework,Asp.net Web Api,将JSON转换为对象时出错。我可以通过Fiddler获得JSON,所以我想我的Web API没有问题 这是我的错误: {“无法将当前JSON对象(例如,{“name\”:\“value\”})反序列化为类型“System.Collections.Generic.List`1[MvcMobile.WebAPI.Model.Person]”,因为该类型需要JSON数组(例如[1,2,3])才能正确反序列化。\r\n若要修复此错误,请将JSON更改为JSON数组(例如[1,2,3])或者更改反序列化类

将JSON转换为对象时出错。我可以通过Fiddler获得JSON,所以我想我的Web API没有问题

这是我的错误:

{“无法将当前JSON对象(例如,{“name\”:\“value\”})反序列化为类型“System.Collections.Generic.List`1[MvcMobile.WebAPI.Model.Person]”,因为该类型需要JSON数组(例如[1,2,3])才能正确反序列化。\r\n若要修复此错误,请将JSON更改为JSON数组(例如[1,2,3])或者更改反序列化类型,使其成为可以从JSON对象反序列化的普通.NET类型(例如,不是integer之类的基元类型,也不是数组或列表之类的集合类型)。还可以将JsonObjectAttribute添加到该类型,以强制其从JSON对象反序列化。\r\n路径“BusinessEntityID”,第1行,位置30。“}

这是JSON:

{"$id":"1", "BusinessEntityID":1,"PersonType":"EM","NameStyle":false,"Title":null,
"FirstName":"Ken", "MiddleName":"J","LastName":"Sánchez","Suffix":null,
"EmailPromotion":0,"AdditionalContactInfo":null,"Demographics":"0",
"rowguid":"92c4279f-1207-48a3-8448-4636514eb7e2",
"ModifiedDate":"2003-02-    08T00:00:00","Employee":null}
这是代码:

HttpResponseMessage resp = client.GetAsync("http://localhost:8080/api/person/GetPerson/" + id).Result;
resp.EnsureSuccessStatusCode();

var result = resp.Content.ReadAsAsync<IEnumerable<Person>>().Result;

可能是因为我只得到一个JSON有问题的实体吗?还是缺少[]{}的东西?或者,mabye是从JSON转换为对象的更好方法?

错误消息似乎很有解释性。您试图反序列化到的任何类都需要一个数组。您的JSON只是一个对象。您可以尝试在其周围放置方括号,使其成为单个项目数组

大概是这样的:

[{"$id":"1", "BusinessEntityID":1,"PersonType":"EM","NameStyle":false,"Title":null,
"FirstName":"Ken", "MiddleName":"J","LastName":"Sánchez","Suffix":null,
"EmailPromotion":0,"AdditionalContactInfo":null,"Demographics":"0",
"rowguid":"92c4279f-1207-48a3-8448-4636514eb7e2",
"ModifiedDate":"2003-02-    08T00:00:00","Employee":null}]

错误消息似乎很有解释性。您试图反序列化到的任何类都需要一个数组。您的JSON只是一个对象。您可以尝试在其周围放置方括号,使其成为单个项目数组

大概是这样的:

[{"$id":"1", "BusinessEntityID":1,"PersonType":"EM","NameStyle":false,"Title":null,
"FirstName":"Ken", "MiddleName":"J","LastName":"Sánchez","Suffix":null,
"EmailPromotion":0,"AdditionalContactInfo":null,"Demographics":"0",
"rowguid":"92c4279f-1207-48a3-8448-4636514eb7e2",
"ModifiedDate":"2003-02-    08T00:00:00","Employee":null}]

原因是您正在调用/api/person/GetPerson/1(即,您希望得到一个结果)

如果您正在调用/api/person/all,那么您将使用IEnumerable,因为您需要不止一个结果


另外-可能值得删除URI的GetPerson部分-它是REST,因此api/person/id是足够的信息。

原因是您正在调用/api/person/GetPerson/1(即,您期望一个结果)

如果您正在调用/api/person/all,那么您将使用IEnumerable,因为您需要不止一个结果


另外-可能值得删除URI中的GetPerson部分-它是REST,因此api/person/id是足够的信息。

我将代码改为,它对我来说很有用

var result = resp.Content.ReadAsAsync<Person>().Result;
var result=resp.Content.ReadAsAsync().result;

我把代码改成了,结果我成功了

var result = resp.Content.ReadAsAsync<Person>().Result;
var result=resp.Content.ReadAsAsync().result;

我在我的MVC4项目中定义了以下路由:url:“{controller}/{action}/{id}”,因此我必须将操作放在url中。是的,但您也有默认值,因此您可以有两个索引方法,Index(void)(获取所有人)和Index(int-id)(获取单个人)。我知道,但我使用该路由解决方案;)我在我的MVC4项目中定义了以下路由:url:“{controller}/{action}/{id}”,因此我必须将该操作放在url中。是的,但您也有默认值,因此您可以有两个索引方法,Index(void)(get all person)和Index(int id)(get single person)。我知道,但我将该路由用于此解决方案;)