猿问

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

我有一个这样的 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# 对象


红糖糍粑
浏览 196回答 3
3回答

芜湖不芜

您的数据模型应如下所示:public class Info{&nbsp; &nbsp; public string prop1 {get;set;}&nbsp; &nbsp; public string prop2 {get;set;}&nbsp; &nbsp; public int prop3 {get;set;}&nbsp; &nbsp; // Modified from&nbsp;&nbsp; &nbsp; //public Dictionary<string, List<int>> prop4 {get;set}&nbsp; &nbsp; public List<Dictionary<string, int>> prop4 {get;set;}}public class Response{&nbsp; &nbsp; // Modified from&nbsp;&nbsp; &nbsp; //public class Dictionary<string, List<Info>> Item {get;set;}&nbsp; &nbsp; public Dictionary<string, Info> Items {get;set;}}笔记:Response.Item应该被命名为Items.在您的 JSON 中,"Items"是一个具有可变名称对象值属性的对象:{&nbsp; &nbsp; "Items": {&nbsp; &nbsp; &nbsp; &nbsp; "Item_1A": { },&nbsp; &nbsp; &nbsp; &nbsp; "Item2B": { }&nbsp; &nbsp; }}这应该建模为Dictionary<string, T>适当的非集合类型T。假设您正在使用json.net有关详细信息,请参阅序列化指南:字典。如果不,javascript序列化器 行为相似。您的数据模型 ,public class Dictionary<string, List<Info>> Items将适用于具有可变名称数组值属性的对象:{&nbsp; &nbsp; "Items": {&nbsp; &nbsp; &nbsp; &nbsp; "Item_1A": [{ },{ }],&nbsp; &nbsp; &nbsp; &nbsp; "Item2B": [{ }]&nbsp; &nbsp; }}但这不是你所拥有的。同时"prop4"是一个包含对象的数组,该对象具有可变名称的对象值属性,例如:"prop4": [ // Outer container is an array&nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; // Inner container is an object&nbsp; &nbsp; "prop_x": 100&nbsp; },&nbsp; {&nbsp; &nbsp; "prop_y": 200&nbsp; }]List<T>因此,应将诸如此类的集合用作外部泛型类型:public List<Dictionary<string, int>> prop4 {get;set;}请参阅序列化指南:IEnumerable、列表和数组。如您所见,代码生成工具(例如如何从 JSON 对象字符串自动生成 C# 类文件中提到的工具)通常无法识别具有可变属性名称的 JSON 对象。在这种情况下,自动生成的类可能需要手动替换Dictionary<string, T>为包含类型中的适当属性。样品工作小提琴在这里。

浮云间

这是在 json 之后创建代理类的提示:首先,要确保它是有效的 JSON,请访问此网站并运行验证器:https ://jsonlint.com/如果可以,有一些工具可以直接将 json 和 xml 转换为 ac# 代理类,例如: http:&nbsp;//json2csharp.com/:https ://xmltocsharp.azurewebsites.net/现在你去吧!只需将它们复制到您的模型并开始使用它。

小怪兽爱吃肉

只是对您的模型进行了一些小改动。你prop4是一个列表或数组。public class Info{&nbsp; public string prop1 {get;set;}&nbsp; public string prop2 {get;set;}&nbsp; public int prop3 {get;set;}&nbsp; public List<Dictionary<string, List<int>>> prop4 {get;set}}public class&nbsp; Response{&nbsp; public class Dictionary<string, Info> Items {get;set;} // Should be named Items}
随时随地看视频慕课网APP
我要回答