我有一个简单的人物对象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对象?
答案 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")]
众所周知,主要对象(文档)需要它,但在嵌套对象上不需要它们,直到它们在列表中。