从服务异步获取列表

时间:2017-08-14 12:07:15

标签: c# .net json

在尝试从网址获取列表时,程序会停止并抛出类似

的异常
  

类型' System.AggregateException'的例外情况发生在mscorlib.dll中但未在用户代码中处理

  

无法将当前JSON对象(例如{" name":" value"})反序列化为类型System.Collections.Generic.IEnumerable`1 [WebAPIDemo.Models .Person]'因为该类型需要JSON数组(例如[1,2,3])才能正确反序列化。   要修复此错误,请将JSON更改为JSON数组(例如[1,2,3])或更改反序列化类型,使其成为普通的.NET类型(例如,不是像整数这样的基本类型,而不是类似的集合类型可以从JSON对象反序列化的数组或List。 JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化。   路径'消息',第1行,第11位。

我之所以认为是因为在我的程序中使用了IEnumerable,但是当我只使用MyObject时,它会远离这一点,但它会闯入其他地方。

我现在卡住了。这是我的代码。

CONTROLLER.CS

private IEnumerable<Person> CallPersonListServiceAsync(HttpClient ins, string url)
{
    var content = ins.GetAsync(url).Result.Content;
    var personsList = content.ReadAsAsync(typeof(IEnumerable<Person>)).Result as IEnumerable<Person>;
    return personsList;
}

PERSON.CS

public class Person
{
    public string name { get; set; }
    public string surname { get; set; }
    public DateTime dob { get; set; }
}

是否真的发生了因为我使用IEnumberable或其他不同的东西。感谢

1 个答案:

答案 0 :(得分:1)

错误告诉您,您收到的JSON是一个对象,而不是一个集合。所以你必须将它反序列化为一个对象,而不是一个集合。除非JSON 非常与您期望的不同(即根本不是Person),否则您只需将其反序列化为Person

var result =  content.ReadAsAsync(typeof(Person)).Result as Person;

当然需要更改方法的返回类型(和名称):

private Person CallPersonServiceAsync(HttpClient ins, string url)

或者,不是更改方法签名,而是可以从该单个人制作一个列表并返回:

return new List<Person> { result };

另外,您的代码的异步性质非常糟糕。首先,您明确地调用了.Result,而几乎总是是错误的方法。其次,您的方法名称将其作为异步方法通告,但它根本不是异步。

您可以通过使用async和等待来纠正这两个问题:

private async Task<Person> CallPersonServiceAsync(HttpClient ins, string url)
{
    var content = (await ins.GetAsync(url)).Content;
    var result =  (await content.ReadAsAsync(typeof(Person))) as IEnumerable<Person>;
    return result;
}