反序列化 Json 以列出 C#
Deserialize Json to List C#
我在反序列化 Json 时遇到了一些问题,api returns。
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 函数 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);
...
为此您可能需要一个包装器 class,因为 json 对象不仅是一个数组本身,而且还有一个节点 "Result"
以及该数组的值。
public class ContactResult
{
public List<ContactType> Result {get; set;}
}
然后用那个包装器调用你的方法class:
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; }
}
您的代码失败,因为它试图将 JSON 反序列化为键入 List<ContactType>
,而实际上它是具有包含列表的 RootObject 类型。
因此,如果您首先像这样反序列化为 RootObject
的类型:
JsonConvert.DeserializeObject<RootObject>(str)
然后您可以访问反序列化的 RootObject
对象中的列表。
我在反序列化 Json 时遇到了一些问题,api returns。
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
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);
...
为此您可能需要一个包装器 class,因为 json 对象不仅是一个数组本身,而且还有一个节点 "Result"
以及该数组的值。
public class ContactResult
{
public List<ContactType> Result {get; set;}
}
然后用那个包装器调用你的方法class:
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; }
}
您的代码失败,因为它试图将 JSON 反序列化为键入 List<ContactType>
,而实际上它是具有包含列表的 RootObject 类型。
因此,如果您首先像这样反序列化为 RootObject
的类型:
JsonConvert.DeserializeObject<RootObject>(str)
然后您可以访问反序列化的 RootObject
对象中的列表。