【问题标题】:Deserialise JSON into an ASP.Net generic-list derived class将 JSON 反序列化为 ASP.Net 通用列表派生类
【发布时间】:2016-12-15 10:28:25
【问题描述】:

使用 ASP.Net 4.5 JavaScriptSerializer 类,是否可以将 JSON 字符串直接反序列化为泛型列表派生类?

例如,如果我有以下内容,它可以工作......

public class MyClass {
  public int Id { get; set; }
}
string json = "[{\"Id\":1},{\"Id\":2}]";
var ser = new System.Web.Script.Serialization.JavaScriptSerializer();
var myList = (List<MyClass>)ser.Deserialize<List<MyClass>>(json);

但如果我想通过从List&lt;MyClass&gt; 派生来收集MyClass(以便该类可以包含处理数据的函数)并执行以下操作...

public class MyClasses : List<MyClass> { ... }

然后我无法反序列化...

var myList = ser.Deserialize<MyClasses>(json);

当我得到以下运行时错误(代码确实编译)

无法将“System.Collections.Generic.List`1[MyClass]”类型的对象转换为“MyClasses”类型。

如果可能,我想避免使用外部库


我刚刚想到的一个解决方案是通过给 MyClasses 一个额外的构造函数来执行以下操作,该构造函数采用 List&lt;MyClass&gt;

public class MyClasses : List<MyClass> {
  public MyClasses() { }
  public MyClasses(List<MyClass> classes) {
    foreach(var class in classes)
      this.Add(class);
  }
  ...
}

然后将其传递给类的新实例...

var myList = new MyClasses(ser.Deserialize<MyClasses>(json));

我仍然会很感激任何关于更好地解决这个问题的想法。

【问题讨论】:

    标签: asp.net json serialization


    【解决方案1】:

    您可以使用Newtonsoft.Json

    string json = "[{\"Id\":1},{\"Id\":2}]";
    var myList = JsonConvert.DeserializeObject<List<MyClass>>(json);            
    

    【讨论】:

    • 如果可能的话,我想避免使用外部库 - 你有不使用外部库的答案吗?看起来您已经完全避免了反序列化为MyClasses 的问题
    • MyClasses 不就是 MyClass 的一个列表吗?
    • 在我的例子中,是的......但它会有大量的函数来处理数据
    猜你喜欢
    • 2017-06-05
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多