将 JSON 对象反序列化为类

本文关键字:反序列化 对象 JSON | 更新日期: 2023-09-27 18:34:24

我在将 JSON 对象反序列化为类(使用 JSON.NET)时遇到了一点麻烦,希望有人能为我指出正确的方向。 下面是我正在尝试的代码片段,并一直在dotnetfiddle进行测试

下面是 JSON 的示例:

{
    "`LCA0001": {
        "23225007190002": "1",
        "23249206670003": "1",
        "01365100070018": "5"
    },
    "`LCA0003": {
        "23331406670018": "1",
        "24942506670004": "1"
    },
    "`LCA0005": {
        "01365100070018": "19"
    }
}

我正在尝试使用此代码:

using System;
using System.Collections.Generic;
using Newtonsoft.Json;
public class Program
{
    public static void Main()
    {
        string json = "{'"`LCA0001'": {'"23225007190002'": '"1'",'"23249206670003'": '"1'",'"01365100070018'": '"5'"},'"`LCA0003'": {'"23331406670018'": '"1'",'"24942506670004'": '"1'"},'"`LCA0005'": {'"01365100070018'": '"19'"}}";
        Console.WriteLine(json);
        Console.WriteLine();
        //This works
        Console.Write("Deserialize without class");
        var root = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, int>>>(json);
        foreach (var locationKvp in root)
        {
            foreach (var skuKvp in locationKvp.Value)
            {
                Console.WriteLine("location: " + locationKvp.Key + ", sku: " +  skuKvp.Key + ", qty: " + skuKvp.Value);
            }
        }
        //Why doesn't this work?
        Console.Write("'nDeserialize with class");      
        var root2 = JsonConvert.DeserializeObject<InventoryLocations>(json);
        foreach (var locationKvp in root2.InventoryLocation)
        {
            foreach (var skuKvp in locationKvp.Value)
            {
                Console.WriteLine("location: " + locationKvp.Key + ", sku: " +  skuKvp.Key + ", qty: " + skuKvp.Value);
            }
        }
    }
}
class InventoryLocations
{
    public Dictionary<Location, Dictionary<Sku, Qty>> InventoryLocation { get; set; }
}
public class Location
{
    public string location { get; set; }
}
public class Sku
{
    public string sku { get; set; }
}
public class Qty
{
    public int qty { get; set; }
}

序列化为类不起作用有什么原因吗? 我只是错误地定义了类吗?

将 JSON 对象反序列化为类

我在这里看到两个问题:一个是使用类作为字典键 - JSON 那里有简单的字符串(实际上不能有其他任何东西),所以这是行不通的。

第二个问题是 JSON 对类的反序列化通过将键与属性匹配来工作 - 因此它转换类似

{
    "prop1": "value1",
    "prop2": "value2"
}

到以下实例:

public class MyClass {
   public string prop1 { get; set; }
   public string prop2 { get; set; }
}

在您的情况下,这是行不通的,因为在您的 JSON 中,所有键都不是有效的属性名称。你必须坚持反序列化为字典

从JSON生成类的方法之一是使用Visual Studio。

导航到 Edit -> Paste Special -> Paste JSON As Classes 。对于有问题的已发布 JSON,将生成以下类。

public class Rootobject
{
    public LCA0001 LCA0001 { get; set; }
    public LCA0003 LCA0003 { get; set; }
    public LCA0005 LCA0005 { get; set; }
}
public class LCA0001
{
    public string _23225007190002 { get; set; }
    public string _23249206670003 { get; set; }
    public string _01365100070018 { get; set; }
}
public class LCA0003
{
    public string _23331406670018 { get; set; }
    public string _24942506670004 { get; set; }
}
public class LCA0005
{
    public string _01365100070018 { get; set; }
}

除了 MiMo 的答案之外,您还可以使用 ContractResolver 在类中序列化/反序列化字典。

这是 dotnetfiddle 中代码的工作示例。

请注意,具有协定解析程序的序列化 Json 与原始 json 不同。必须使用此协定解析器对其进行序列化,以便也使用它进行反序列化。

我从这个 StackOverflow 问题中提取了合约解析器,如果您需要更多澄清。