如何将JSON反序列化为List <t>?

时间:2018-08-15 19:38:24

标签: c# json json.net

我想将此json反序列化为Product对象列表,但出现此错误:

  

Newtonsoft.Json.JsonSerializationException:无法将当前JSON对象(例如{“ name”:“ value”})反序列化为类型'System.Collections.Generic.List`1 [ShoppingList.Product]',因为该类型需要一个JSON数组(例如[1,2,3])可正确反序列化。   要解决此错误,可以将JSON更改为JSON数组(例如[1,2,3]),也可以更改反序列化类型,使其成为普通的.NET类型(例如,不像整数这样的原始类型,也不像这样的集合类型数组或列表),可以从JSON对象反序列化。还可以将JsonObjectAttribute添加到类型中,以强制其从JSON对象反序列化。

这是我的代码:

{
    "records": [
        {
            "id": "60",
            "name": "Rolex Watch",
            "description": "Luxury watch.",
            "price": "25000",
            "category_id": "1",
            "category_name": "Fashion"
        },
        {
            "id": "48",
            "name": "Bristol Shoes",
            "description": "Awesome shoes.",
            "price": "999",
            "category_id": "5",
            "category_name": "Movies"
        },
        {
            "id": "42",
            "name": "Nike Shoes for Men",
            "description": "Nike Shoes",
            "price": "12999",
            "category_id": "3",
            "category_name": "Motors"
        }
    ]   
}

public class Product
{
    public int id { get; set; }
    public string name { get; set; }
    public string description { get; set; }
    public decimal price { get; set; }
    public int category_id { get; set; }
    public string category_name { get; set; }
}

public async Task<List<Product>> GetProductsAsync()
    {
        Products = new List<Product>();

        var uri = new Uri("https://hostname/api/product/read.php");

        try
        {
            var response = await client.GetAsync(uri);
            if (response.IsSuccessStatusCode)
            {
                var content = await response.Content.ReadAsStringAsync();
                Products = JsonConvert.DeserializeObject<List<Product>>(content);
            }
        }
        catch (Exception )
        {
            throw;
        }

        return Products;
    }

4 个答案:

答案 0 :(得分:9)

您的Json不是List<Product>,而是一个具有records单个属性的对象,而该属性是List<Product>

所以您的实际C#模型是这样的:

public class RootObject
{
    public List<Product> records { get; set; }
}

然后您这样反序列化:

RootObject productsRoot = JsonConvert.DeserializeObject<RootObject>(content);

答案 1 :(得分:1)

问题在于,您提供的响应JSON是一个包含列表的对象,但是您试图将数据反序列化为一个直接列表。我认为您需要做的就是在代码中添加一个包含该列表的第二个类,然后使用该列表进行反序列化。

public class Product
{
    public int id { get; set; }
    public string name { get; set; }
    public string description { get; set; }
    public decimal price { get; set; }
    public int category_id { get; set; }
    public string category_name { get; set; }
}

public class RootProduct
{
    public List<Product> Products {get;set;}
}

然后将反序列化部分从列表更改为

RootProduct response = JsonConvert.DeserializeObject<RootProduct>(content);

该用法将仅是产品。响应。产品可以访问项目列表。

答案 2 :(得分:0)

问题是您的json结构。以下是json数组的示例-注意,我删除了属性“ records”。

[
    {
        "id": "60",
        "name": "Rolex Watch",
        "description": "Luxury watch.",
        "price": "25000",
        "category_id": "1",
        "category_name": "Fashion"
    },
    {
        "id": "48",
        "name": "Bristol Shoes",
        "description": "Awesome shoes.",
        "price": "999",
        "category_id": "5",
        "category_name": "Movies"
    },
    {
        "id": "42",
        "name": "Nike Shoes for Men",
        "description": "Nike Shoes",
        "price": "12999",
        "category_id": "3",
        "category_name": "Motors"
    }
]  

答案 3 :(得分:0)

提供此数据

[
    {
        "id": "60",
        "name": "Rolex Watch",
        "description": "Luxury watch.",
        "price": "25000",
        "category_id": "1",
        "category_name": "Fashion"
    },
    {
        "id": "48",
        "name": "Bristol Shoes",
        "description": "Awesome shoes.",
        "price": "999",
        "category_id": "5",
        "category_name": "Movies"
    },
    {
        "id": "42",
        "name": "Nike Shoes for Men",
        "description": "Nike Shoes",
        "price": "12999",
        "category_id": "3",
        "category_name": "Motors"
    }
]  

这个类的定义

public class Order
{
    public int id { get; set; }
    public string name { get; set; }
    public string description { get; set; }
    public string price { get; set; }
    public string category_id { get; set; }
    public string category_name { get; set; }
}

将其从JSON转换为C#List<Order>的代码是:

public static List<Order> Map(string json)
{
    return Newtonsoft.Json.JsonConvert.DeserializeObject<List<Order>>(json);
}