我为什么不能反序列化对我的实体的响应?

时间:2019-03-06 03:58:04

标签: c# asp.net

环境:VS 2017 Entity Framework 6.0

文章参考
https://dzone.com/articles/a-few-great-ways-to-consume-restful-apis-in-c

问题: 如何将Web Api 2通话转换为我的实体?

人员实体

public partial class Person
{
    public int id { get; set; }
    public string name { get; set; }
}

...

Web API 2控制器

namespace WebApplication2.Controllers
{
    public class PeopleController : ApiController
    {
        private testdbEntities db = new testdbEntities();

        // GET: api/People
        public IQueryable<Person> GetPeople()
        {
            return db.People;
        }

...

无法使最后一行正常工作

var client = new WebClient();
client.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
var response = client.DownloadString("http://localhost:49777/api/People");
var releases = JArray.Parse(response);  //This works
Person p = JsonConvert.DeserializeObject<Person>(response); //How do I get this to work?

...

错误

  

Newtonsoft.Json.JsonSerializationException HResult = 0x80131500
  Message =无法将当前JSON数组(例如[1,2,3])反序列化为   键入“ WebApplication1.Person”,因为该类型需要JSON对象   (例如{“ name”:“ value”})正确反序列化。解决此错误   将JSON更改为JSON对象(例如{“ name”:“ value”})或   将反序列化类型更改为数组或实现   集合接口(例如ICollection,IList),例如List   从JSON数组反序列化。 JsonArrayAttribute也可以是   添加到类型以强制其从JSON数组反序列化。路径   '',第1行,位置1。Source = Newtonsoft.Json StackTrace:在   Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureArrayContract(JsonReader   阅读器,键入objectType,JsonContract合同)

enter image description here

1 个答案:

答案 0 :(得分:1)

执行此操作。

var client = new WebClient();
client.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
var response = client.DownloadString("http://localhost:49777/api/People");
var releases = JArray.Parse(response);  //This works
var people = JsonConvert.DeserializeObject<Person[]>(response);

已更改

Person p = JsonConvert.DeserializeObject<Person>(response);

对此。

var people = JsonConvert.DeserializeObject<Person[]>(response);

在您所涉及的文章链接中,他们使用的端点返回版本列表。这就是他们首先将其解析为Json Array的原因。

根据您从端点返回的内容,您的代码将更改。但是由于您说过JArray.Parse(行正在成功执行,所以我认为您的端点也正在返回人员列表。因此,您需要将其反序列化为people列表而不是单个people对象。