11

我有一个看起来像这样的 json 结构:

"list":[
  {
    "type":"link",
    "href":"http://google.com"
  },
  {
    "type":"image",
    "src":"http://google.com/logo.png"
  },
  {
    "type":"text",
    "text":"some text here"
  },
]

我想将其反序列化为对象列表,其中每个对象都是基类的子类。列表中的每个项目都有不同的属性(href、src、文本),所以我不能使用同一个类来达到一个。相反,我想要一个普通类的三个子类。JSON 列表中每个项目的 type 属性可用于决定使用哪个子类。例如,我可以有以下课程

public Item{
  public string type {get; set;}
}
public LinkItem : Item {
  public string href {get; set;}
}
public ImageItem : Item {
  public string src {get; set;}
}
public TextItem : Item {
  public string text {get; set;}
}

有没有办法做到这一点?还是有更好的方法来反序列化异构对象类型列表?

编辑:

顺便说一句,我正在使用 json.net

4

1 回答 1

1

正如@AmithGeorge 建议的那样,您可以使用一个dynamic对象来动态解析您的 json 对象。您可以使用Shawn Weisfeld 为 JSON 编写的这个出色的动态类这是他的博客,解释了他是如何做到的

JavaScriptSerializer jss = new JavaScriptSerializer();
jss.RegisterConverters(new JavaScriptConverter[] { new DynamicJsonConverter() });

dynamic glossaryEntry = jss.Deserialize(json, typeof(object)) as dynamic;

Console.WriteLine("glossaryEntry.glossary.title: " + glossaryEntry.glossary.title);
Console.WriteLine("glossaryEntry.glossary.GlossDiv.title: " + glossaryEntry.glossary.GlossDiv.title);
Console.WriteLine("glossaryEntry.glossary.GlossDiv.GlossList.GlossEntry.ID: " + glossaryEntry.glossary.GlossDiv.GlossList.GlossEntry.ID);
Console.WriteLine("glossaryEntry.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.para: " + glossaryEntry.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.para);
foreach (var also in glossaryEntry.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso)
{
    Console.WriteLine("glossaryEntry.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso: " + also);
}
于 2012-07-11T09:54:22.537 回答