将Json反序列化为List C#

时间:2016-06-03 11:07:36

标签: c# json.net json-deserialization

我在api返回的反序列化方面遇到了一些问题。

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对象(例如{&#34; name&#34;:&#34; value&#34;})反序列化为类型&#39; System.Collections.Generic.List`1&# 39;因为该类型需要JSON数组(例如[1,2,3])才能正确反序列化。

感谢任何帮助,谢谢。

3 个答案:

答案 0 :(得分:2)

您尝试反序列化的对象有一个包含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);
...

答案 1 :(得分:1)

你可能需要一个包装器类,因为json对象不仅仅是一个数组本身,而是一个节点"Result",其值为该数组。

public class ContactResult
{
    public List<ContactType> Result {get; set;}
}

然后使用该包装类调用您的方法:

var test = await _items.GetContactTypes<ContactResult>(AuthToken.access_token);

答案 2 :(得分:1)

如果您在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类型:

JsonConvert.DeserializeObject<RootObject>(str)

然后,您可以访问反序列化的RootObject对象内的列表。