【问题标题】:Represent JSON as a C# Class将 JSON 表示为 C# 类
【发布时间】:2013-11-01 23:28:21
【问题描述】:

我想将此 JSON 反序列化为 C# 类,但我需要先定义该类:

{
"Prods": [
    {
        "ID": {
            "1001": [
                {
                    "Name": "Name1",
                    "Prod": "XXX"
                },
                {
                    "Name": "Name2",
                    "Prod": "XXXX"
                }
            ]
        }
    },
    {
        "ID": {
            "2001": [
                {
                    "Name": "Name3",
                    "Prod": "XXX-000"
                },
                {
                    "Name": "Name4",
                    "Prod": "XXXX-1111"
                }
            ]
        }
    }
]
}

我想将它反序列化成这样的东西,但不确定我的 JSON 结构是否适合它:

public class Prod
{
    int CATID;
    Dictionary<string, string> prods = new Dictionary<string, string>();
}

public class Prods
{
   public List<Prod> Products {get;set;}
}

我应该如何更改上面的 JSON 以适应它下面的类,以便我可以使用 JsonConvert 反序列化到它?

谢谢!

【问题讨论】:

  • 您的 JSON 具有“ID”、“Name”、“Prod”等字段名称,这意味着它不会一步转换为字典。您最好的选择是反序列化为 Lists<.> 然后从那里运行 .Select(...).ToDictionary(...).
  • 您希望您的 C# 匹配 JSON,还是您的 JSON 匹配 C# 代码?还是您愿意接受其中任何一个方面的变化?
  • 为 JSON 中的 all 对象定义自定义类型。
  • 我希望 JSON 匹配 C#。

标签: c# json deserialization


【解决方案1】:

对我来说,您的 JSON 看起来是错误的,因为您并不总是拥有“一致”的名称/值对。首先我会这样定义我的 JSON

{
  "Prods": 
    [{
      "ID": "1001",
      "Items": 
        [{
          "Name": "Name1",
          "Prod": "XXX"
        },
        {
          "Name": "Name2",
          "Prod": "XXXX"
        }]        
    },
    {
      "ID": "2001", 
      "Items": 
        [{
          "Name": "Name3",
          "Prod": "XXX-000"
        },
        {
          "Name": "Name4",
          "Prod": "XXXX-1111"
        }]        
    }]
}

那么我将有以下类来处理数据

public class Item {
  public string Name { get; set;}
  public string Prod { get; set;}
}

public class Product {
  public string ID { get; set;}
  public List<Item> Items { get; set; }
}

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

然后我会使用json.net 之类的东西来处理序列化

【讨论】:

  • 一个问题,当我在课堂上反序列化时,会是这样的一步:Jsonconvert...还是我也必须转换其他的?
  • 您应该只需要处理顶级实体,即JsonConvert.DeserializeObject&lt;Products&gt;(jsondata);
【解决方案2】:

在 Visual Studio 2019 中,您可以创建一个新的类文件,删除类存根并使用编辑->选择性粘贴->Paste JSON as Classes。这会很快生成代表 JSON 所需的类。如果你不喜欢它的输出方式,你可以调整你的 JSON 字符串再试一次。

如果您有一些属性没有出现在 JSON 对象的每个实例中,您可以定义 JsonExtensionData 来保存其他属性

    [JsonExtensionData]
    public Dictionary<string, object> additionalJSON { get; set; } =
        new Dictionary<string, object>();

【讨论】:

    猜你喜欢
    • 2017-06-20
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 2018-01-06
    • 2023-04-07
    • 1970-01-01
    • 2022-12-12
    • 1970-01-01
    相关资源
    最近更新 更多