将JSON反序列化为几个C#子类之一

将JSON反序列化为几个C#子类之一,c#,json,inheritance,deserialization,C#,Json,Inheritance,Deserialization,我有一个json结构,看起来像这样: "list":[ { "type":"link", "href":"http://google.com" }, { "type":"image", "src":"http://google.com/logo.png" }, { "type":"text", "text":"some text here" }, ] 我想将其反序列化为对象列表,其中每个对象都是基类的子类。列表中的每个项目

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

"list":[
  {
    "type":"link",
    "href":"http://google.com"
  },
  {
    "type":"image",
    "src":"http://google.com/logo.png"
  },
  {
    "type":"text",
    "text":"some text here"
  },
]
我想将其反序列化为对象列表,其中每个对象都是基类的子类。列表中的每个项目都有不同的属性(href、src、text),因此我不能将同一个类用于reach。相反,我想要一个普通类的三个子类。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,顺便说一句,

正如@AmithGeorge所建议的,您可以使用
动态
对象来动态解析json对象。你可以用


创建一个具有所有属性的类怎么样。反序列化以获取该类实例的列表。然后根据类型进行筛选,并投影创建专用实例所需的属性。我假设这就是您目前正在做的事情,并且正在寻找一种更好的方法?随着应用程序的增长,单个项的复杂性可能会增加,并且使用一个包含所有可能属性的基类似乎是个坏主意。我考虑的是使用一个匿名对象,然后稍后根据类型创建一个实例。我不是指基类。我想更多的是中级dto类,它有所有可能的选项。从dto对象列表中,可以塑造所需的专用对象。这样,您的域就不必被序列化问题弄糊涂了。也就是说,可以使用动态对象吗?我不知道匿名类型可以允许您不定义某些属性。。。正如中所述,第一个反序列化的anon对象的属性与第二个反序列化的anon对象的属性不相同。链接处可能存在重复的JsonConverter应答已失效。您能找到并重新发布吗?-谢谢@Danviole Tsagmiller对不起,我想他已经删除了他的存储库。不过,你还是可以按照我第二次发言的指示去做。
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);
}