我是否需要从DocumentDb反序列化查询结果?

时间:2014-09-05 03:20:53

标签: c# asp.net-mvc json serialization azure-cosmosdb

我有一个简单的人物对象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对象(例如{&#34; name&#34;:&#34; value&#34;})反序列化为类型System.Collections.Generic.List`1 [MyApp.Person ]&#39;因为该类型需要JSON数组(例如[1,2,3])才能正确反序列化。要修复此错误,请将JSON更改为JSON数组(例如[1,2,3])或更改反序列化类型,使其成为普通的.NET类型(例如,不是像整数这样的基本类型,而不是类似的集合类型可以从JSON对象反序列化的数组或List。 JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化。 Path&#39; PersonId&#39;,第1行,位置       48。

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

3 个答案:

答案 0 :(得分:4)

这就是我所做的,它的工作原理。如果有更好的方法,我会欣赏其他答案。

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;
}

答案 1 :(得分:4)

安东尼·楚与这一个走在正确的轨道上。简单的解决方案是:

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

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

答案 2 :(得分:0)

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

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

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

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

[JsonProperty(PropertyName = "yourPropertyName")]

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