将 JSON 反序列化为列表 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,函数 GetContactType 是这样调用的:

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])才能正确反序列化。

任何帮助不胜感激,谢谢。

您尝试反序列化的对象具有包含ContactType数组的单个属性Result - 对象模型中没有该属性。尝试反序列化到此对象:

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

您的代码失败,因为它尝试将 JSON 反序列化为类型 List<ContactType>,而它实际上是具有包含列表的 RootObject 类型。

因此,如果您首先反序列化为RootObject类型,如下所示:

JsonConvert.DeserializeObject<RootObject>(str)

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

相关内容

  • 没有找到相关文章

最新更新