[英]Deserialize Json to List C#
我在反序列化api返回的Json时遇到一些问题。
Json是以下内容:
{ "Result":[
{
"Id": 1,
"Type": "Type1"
},
{
"Id": 2,
"Type": "Type2"
}
]}
我正在尝试将其反序列化为这种类型的列表:
public class ContactType
{
public int Id { get; set; }
public string Type { get; set; }
}
下面使用的ReturnType是:List <ContactType>,并以这种方式调用函数GetContactTypes:
var test = await _items.GetContactTypes<List<ContactType>>(AuthToken.access_token);
使用此代码:
public async Task<ReturnType> GetContactTypes<ReturnType>(string access_token)
{
try
{
Header = string.Format("Bearer {0}", access_token);
client.DefaultRequestHeaders.Add("Authorization", Header);
HttpResponseMessage response = await client.GetAsync(base_url + "contacttypes");
if (response.StatusCode == HttpStatusCode.OK)
{
return JsonConvert.DeserializeObject<ReturnType>(await response.Content.ReadAsStringAsync());
}
else
{
return default(ReturnType);
}
}
catch (Exception ex)
{
return default(ReturnType);
}
}
但是我总是会收到这个错误:
无法将当前JSON对象(例如{“ name”:“ value”})反序列化为类型'System.Collections.Generic.List`1',因为该类型需要JSON数组(例如[1,2,3])来反序列化正确地。
任何帮助表示赞赏,谢谢。
您要反序列化的对象具有单个属性Result
其中包含ContactType
数组-您的对象模型中没有该属性。 尝试反序列化此对象:
public class MyClass // give this a more meaningful name
{
public List<ContactType> Result{ get; set; }
}
public class ContactType
{
public int Id { get; set; }
public string Type { get; set; }
}
接着:
...
var test = await _items.GetContactTypes<MyObject>(AuthToken.access_token);
...
您可能需要一个包装器类,因为json对象不仅是数组本身,而且带有带有该数组值的节点"Result"
。
public class ContactResult
{
public List<ContactType> Result {get; set;}
}
然后使用该包装器类调用您的方法:
var test = await _items.GetContactTypes<ContactResult>(AuthToken.access_token);
如果您在json2csharp.com上为此JSON生成C#类,则会看到它创建了两个类:ContactType和RootObject:
public class ContactType
{
public int Id { get; set; }
public string Type { get; set; }
}
public class RootObject
{
public List<ContactType> Result { get; set; }
}
您的代码失败,因为当它实际上是带有包含列表的RootObject类型时,它试图反序列化JSON以键入List<ContactType>
。
因此,如果您首先反序列化RootObject
类型, RootObject
所示:
JsonConvert.DeserializeObject<RootObject>(str)
然后,您可以访问反序列化RootObject
对象内部的列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.