JSON没有正确反序列化Web API

时间:2012-09-17 14:52:59

标签: .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])或更改反序列化类型,以便它是一个普通的.NET类型(例如,不是像整数的基本类型,不是像数组或列表那样的集合类型),可以从JSON对象反序列化。 JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化。\ r \ nPath' 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;

在实体框架中,我设置了以下两个选项:

this.Configuration.LazyLoadingEnabled = false; 
this.Configuration.ProxyCreationEnabled = false;

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

3 个答案:

答案 0 :(得分:1)

原因是你正在调用/ api / person / GetPerson / 1(即你期待一个结果)。

如果您正在调用/ api / person / all - 那么您将使用IEnumerable,因为您期望有多个结果。

另外 - 可能值得删除URI的GetPerson部分 - 它是REST,所以api / person / id就足够了。

答案 1 :(得分:0)

看起来错误信息很明显。无论你想要反序列化的是什么类,都期待一个阵列。您的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}]

答案 2 :(得分:0)

我改变了代码并为我解决了问题。

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