为了账号安全,请及时绑定邮箱和手机立即绑定

将嵌套的 JSON 反序列化为 C# 类

将嵌套的 JSON 反序列化为 C# 类

C#
红糖糍粑 2022-01-15 15:37:18
我有一个这样的 JSON 类{    "Items": {        "Item_1A": {            "prop1": "string",            "prop2": "string",            "prop3": 1,            "prop4": [{                "prop_x": 100            },            {                "prop_y": 200            }]        },        "Item2B": {            "prop1": "string",            "prop2": "string",            "prop3": 14,            "prop4": [{                "prop_z": 300            }]        }    }}我怎么能把它变成 C# 类?这是我到目前为止所拥有的:public class Info{    public string prop1 {get;set;}    public string prop2 {get;set;}    public int prop3 {get;set;}    public Dictionary<string, List<int>> prop4 {get;set;}}public class Response{    public Dictionary<string, List<Info>> Item {get;set;}}我试图按照这个链接,但没有工作将 嵌套的 JSON 反序列化为 C# 对象
查看完整描述

3 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

您的数据模型应如下所示:


public class Info

{

    public string prop1 {get;set;}

    public string prop2 {get;set;}

    public int prop3 {get;set;}

    // Modified from 

    //public Dictionary<string, List<int>> prop4 {get;set}

    public List<Dictionary<string, int>> prop4 {get;set;}

}


public class Response

{

    // Modified from 

    //public class Dictionary<string, List<Info>> Item {get;set;}

    public Dictionary<string, Info> Items {get;set;}

}

笔记:


Response.Item应该被命名为Items.


在您的 JSON 中,"Items"是一个具有可变名称对象值属性的对象:


{

    "Items": {

        "Item_1A": { },

        "Item2B": { }

    }

}

这应该建模为Dictionary<string, T>适当的非集合类型T。假设您正在使用json.net有关详细信息,请参阅序列化指南:字典。如果不,javascript序列化器 行为相似。


您的数据模型 ,public class Dictionary<string, List<Info>> Items将适用于具有可变名称数组值属性的对象:


{

    "Items": {

        "Item_1A": [{ },{ }],

        "Item2B": [{ }]

    }

}

但这不是你所拥有的。


同时"prop4"是一个包含对象的数组,该对象具有可变名称的对象值属性,例如:


"prop4": [ // Outer container is an array

  {        // Inner container is an object

    "prop_x": 100

  },

  {

    "prop_y": 200

  }

]

List<T>因此,应将诸如此类的集合用作外部泛型类型:


public List<Dictionary<string, int>> prop4 {get;set;}

请参阅序列化指南:IEnumerable、列表和数组。


如您所见,代码生成工具(例如如何从 JSON 对象字符串自动生成 C# 类文件中提到的工具)通常无法识别具有可变属性名称的 JSON 对象。在这种情况下,自动生成的类可能需要手动替换Dictionary<string, T>为包含类型中的适当属性。


样品工作小提琴在这里。


查看完整回答
反对 回复 2022-01-15
?
浮云间

TA贡献1829条经验 获得超4个赞

这是在 json 之后创建代理类的提示:

首先,要确保它是有效的 JSON,请访问此网站并运行验证器:https ://jsonlint.com/

如果可以,有一些工具可以直接将 json 和 xml 转换为 ac# 代理类,例如: http: //json2csharp.com/https ://xmltocsharp.azurewebsites.net/

现在你去吧!只需将它们复制到您的模型并开始使用它。


查看完整回答
反对 回复 2022-01-15
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

只是对您的模型进行了一些小改动。你prop4是一个列表或数组。


public class Info

{

  public string prop1 {get;set;}

  public string prop2 {get;set;}

  public int prop3 {get;set;}

  public List<Dictionary<string, List<int>>> prop4 {get;set}

}

public class  Response

{

  public class Dictionary<string, Info> Items {get;set;} // Should be named Items

}


查看完整回答
反对 回复 2022-01-15
  • 3 回答
  • 0 关注
  • 195 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信