繁体   English   中英

将嵌套的JSON反序列化为列表

[英]Deserialize Nested JSON to Lists

我试图将下拉列表与这些列表绑定到我的视图中。 无法将以下JSON集合转换为LISTS。

我的JSON字符串采用以下格式:

 ["AppTypes",
 [
    {
        "AppTypeID": "5136",
        "AppType": "ABC"
    },
    {
        "AppTypeID": "dca6",
        "AppType": "MNO"
    },
    {
        "AppTypeID": "d8de",
        "AppType": "PQR"
    }
],
"CompTypes",
[
    {
        "CompTypeID": "0425",
        "CompType": "STU"
    },        
    {
        "CompTypeID": "0426",
        "CompType": "EDC"
    },
    {
        "CompTypeID": "0444",
        "CompType": "PLM"
    }
]
]

我试图反序列化代码,但没有通过。 我的课,

     public class DAL
     {
           public DAL() { }
           public CompList CompList { get; set; }
     }

     public class CompList
     {
         public CompList()
         {
              AppTypes = new List<AppTypes>();
              CompType = new List<CompTypes>();                   
         }
         public List<AppTypes> AppTypes;
         public List<ComTypes> CompType;
     }
     public class AppTypes
     {
         public Guid AppTypeID { get; set; }
         public string AppType { get; set; }
     }

     public class CompTypes
     {
         public Guid CompTypeID { get; set; }
         public string CompType { get; set; }
     }

     public class JSONSerializer
     {
          public static T ConvertFromJSON<T>(String json)
          {
              JavaScriptSerializer serializer = new JavaScriptSerializer();
              return serializer.Deserialize<T>(json);
          }
     }

控制器代码:

    dynamic obj = JSONSerializer.ConvertFromJSON<DAL>(JsonData);

无法找到我要去的地方。 任何帮助将非常感激。

这里的主要问题是您的JSON表示一个包含字符串或包含对象的嵌套数组的顶级数组,但是您尝试将其反序列化为顶级对象-而不是数组。 您的类设计是相当合理的,但是诸如JavaScriptSerializer类的序列化程序并不是真正设计为在反序列化过程中以这种方式完全重组数据模型。 您可能需要反序列化为更真实的JSON表示形式,然后使用例如Linq重新构造数据。

第二个问题是您将ID属性声明为Guid,但是相应的JSON属性(例如"AppTypeID": "5136" )没有足够的数字作为Guid。 JavaScriptSerializer Guid的"d70d7583-b2e6-4f6e-8d99-2022d3ca2b10" 32位,可以用连字符分隔 ,例如: "d70d7583-b2e6-4f6e-8d99-2022d3ca2b10""d70d7583b2e64f6e8d992022d3ca2b10"

因此,如果我将Guid属性更改为字符串:

public class AppTypes
{
    public string AppTypeID { get; set; }
    public string AppType { get; set; }
}

public class CompTypes
{
    public string CompTypeID { get; set; }
    public string CompType { get; set; }
}

然后,我可以反序列化并转换为CompList ,如下所示:

        var js = new JavaScriptSerializer();
        var array = js.Deserialize<List<object>>(JsonData); // Deserialize outer array
        var compList = new CompList
        {
            AppTypes = array
                .OfType<IEnumerable<object>>()          // Enumerate through nested arrays
                .SelectMany(o => o)                     // Enumerate through elements in nested arrays
                .OfType<IDictionary<string, object>>()  // Pick out those which are JSON objects (deserialized as dictionaries)
                .Where(d => d.ContainsKey("AppType"))   // Filter those that are AppTypes 
                .Select(d => js.ConvertToType<AppTypes>(d)) // Deserialize to the AppTypes class
                .ToList(),
            CompType = array
                .OfType<IEnumerable<object>>()
                .SelectMany(o => o)
                .OfType<IDictionary<string, object>>()
                .Where(d => d.ContainsKey("CompType"))
                .Select(d => js.ConvertToType<CompTypes>(d))
                .ToList(),
        };

仅供参考,您的原始代码可以将看起来像这样的JSON反序列化为CompList

{
  "AppTypes": [
    {
      "AppTypeID": "5136",
      "AppType": "ABC"
    },
    {
      "AppTypeID": "dca6",
      "AppType": "MNO"
    },
    {
      "AppTypeID": "d8de",
      "AppType": "PQR"
    }
  ],
  "CompType": [
    {
      "CompTypeID": "0425",
      "CompType": "STU"
    },
    {
      "CompTypeID": "0426",
      "CompType": "EDC"
    },
    {
      "CompTypeID": "0444",
      "CompType": "PLM"
    }
  ]
}

请注意,最外面的JSON是具有两个数组值属性的对象,而不是两个字符串和两个数组组成的数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM