在 C# 中按类别反序列化 JSON

Deserialize JSON by Categories in C#

我有一个 JSON 文件,其中的产品按类别排序。我正在尝试反序列化 JSON 所以我得到一个 List 这样我就可以轻松访问例如“收藏夹”中的产品。

我发现使用 JSON 时出现问题,因为我还需要类别名称,我现在将它们存储在产品本身中。我想要实现的是轻松地将所有产品存储在“收藏夹”或另一个中。

我这里的主要问题是我不确定哪种数据类型更适合存储此类信息。我的 JSON 是:

{
    "Favoritos": [
        {
            "Categoria" : "CortePelo",
            "Nombre" : "Corte Hombre",
            "Precio" : "10,00",
            "Color" : "57; 62; 65"
        },
        {
            "Categoria" : "CortePelo",
            "Nombre" : "Corte Mujer",
            "Precio" : "100,00",
            "Color" : "57; 62; 65"
        }
    ],
    "CortePelo": [
        {
            "Categoria" : "CortePelo",
            "Nombre" : "Corte Hombre",
            "Precio" : "10,00",
            "Color" : "57; 62; 65"
        },
        {
            "Categoria" : "CortePelo",
            "Nombre" : "Corte Mujer",
            "Precio" : "100,00",
            "Color" : "57; 62; 65"
        }
    ]
}

我的类是:

public class Productos
        {
            public List<List<Producto>> Categorias { get; set; }
        }
        public class Producto 
        {
            public string Categoria { get; set; }
            public string Nombre { get; set; }
            public double Precio { get; set; }


            public string Color { get; set; }


            [JsonConstructor]
            public Producto(string categoria, string nom, double prc, string color)
            {
                Categoria = categoria;
                Nombre = nom;
                Precio = prc;
                Color = color;

            }
        }

我在反序列化中得到的结果为空:

string json = r.ReadToEnd();
Productos productos = JsonConvert.DeserializeObject<Productos>(json);

你得到的是空值,因为反序列化失败。但它没有抛出异常。

正确的类型是 Dictionary

如果你想检查你的反序列化是否正确,首先创建一个对象结构的序列化json对象。

您的 JSON 与 Productos 中定义的架构不匹配。不要使用 Productos class,而是使用 Dictionary<string,Producto[]> 来更好地匹配 JSON.

像这样:

string json = r.ReadToEnd();
Dictionary<string,Producto[]> productosPorCategoria = JsonConvert.DeserializeObject<Dictionary<string,Producto[]>>(json);

注意:如果我弄错了变量名,我很抱歉,我用Google翻译了那个位。


如果您仍想强类型化属性而不是使用字典,则需要像这样更新 Productos

public class Productos
{
    public List<Producto> Favoritos { get; set; }
    public List<Producto> CortePelo { get; set; }
}

你好,你如何制作一个 Producto 列表并将它们序列化到 json, 检索后,您只需将 json 反序列化为一个列表,然后按类别对 Producto 列表进行分组,现在您可以使用 LINQ 访问按类别分组的产品列表列表。

{
   [
        {"Categoria" : "CortePelo",
            "Nombre" : "Corte Hombre",
            "Precio" : "10,00",
            "Color" : "57; 62; 65"
        },{
            "Categoria" : "CortePelo",
            "Nombre" : "Corte Mujer",
            "Precio" : "100,00",
            "Color" : "57; 62; 65"
        },{
            "Categoria" : "CortePelo",
            "Nombre" : "Corte Hombre",
            "Precio" : "10,00",
            "Color" : "57; 62; 65"
        },{
            "Categoria" : "CortePelo",
            "Nombre" : "Corte Mujer",
            "Precio" : "100,00",
            "Color" : "57; 62; 65"
        }
   ]
}

此处将 json 反序列化为 Producto

的列表
string json = r.ReadToEnd();
List<Producto>productos = JsonConvert.DeserializeObject<List<Producto>>(json);

//Here you now group the list of Producto by Categoria
var groupedProductos=productos.GroupBy(x=>x.Categoria);

//To find Products with Categoria 'CortePelo'
var cortePeloGroup=groupedProductos.FirstOrDefault(x=>x.Key=="CortePelo");

//Now you convert the Grouped Producto of Categoria 'CortePelo' to List
List<Producto> cortePeloProductoList = cortePeloGroup.Select(g => g).ToList();