3

对于 person 对象,我有一个简单的 POCO,如下所示:

public class Person
{
   public int PersonId {get; set;}
   public string FirstName {get; set;}
   public string MiddleName {get; set;}
   public string LastName {get; set;}
   public char Gender {get; set;}
}

我有以下代码查询我的 DocumentDb 数据库中的 People 集合。

private async static Task<List<Person>> GetPeopleList(string colSelfLink)
{
   dynamic doc = client.CreateDocumentQuery<Document>(colSelfLink, "SELECT p.PersonId, p.FirstName, p.MiddleName, p.LastName, p.Gender FROM People p").AsEnumerable().FirstOrDefault();
   List<Person> peopleList = new List<Person>();
   if (doc != null)
   {
      peopleList = doc;
   }
   return peopleList;
}

当我运行此代码时,我收到以下错误:

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

如何将来自我的查询的 JSON 对象转换为 Person 对象?在我的 MVC 应用程序中,模型绑定器做得很好,但它在单独的类库中运行。我应该如何转换这个 JSON 对象?

4

3 回答 3

7

这就是我所做的并且有效。如果有更好的方法,我会很感激其他答案。

private async static Task<List<Person>> GetPeopleList(string colSelfLink)
{
   dynamic doc = client.CreateDocumentQuery<Document>(colSelfLink, "SELECT p.PersonId, p.FirstName, p.MiddleName, p.LastName, p.Gender FROM People p").AsEnumerable().ToList();
   List<Person> peopleList = new List<Person>();
   if (doc != null)
   {
      Person person;
      foreach(var item in doc)
      {
         person = JsonConvert.DeserializeObject<Person>(item.ToString());
         peopleList.Add(person);
      }
   }
   return peopleList;
}
于 2014-09-05T15:24:32.903 回答
4

Anthony Chu 在这件事上走在了正确的轨道上。简单的解决方案是:

private async static Task<List<Person>> GetPeopleList(string colSelfLink)
{
   return client.CreateDocumentQuery<Person>(colSelfLink, "SELECT * FROM People").ToList();
}

这将自动反序列化每个返回的记录并将其转换为 People 对象。

于 2014-10-15T04:40:14.627 回答
0

我遇到了完全相同的问题,只是我的失败对象列表嵌套在另一个对象(文档)中。

public List<MyObject> MyProperty { get; set; }

我现在很高兴我找到了解决方案:

如果您的文档中有复杂对象的列表,请将其放在复杂对象的属性中:

[JsonProperty(PropertyName = "yourPropertyName")]

众所周知,在主对象(文档)上需要它们,但在嵌套对象上不需要它们,直到它们在列表中。

于 2015-11-22T16:57:51.173 回答