2012-07-11 156 views
8

我有一个JSON结构看起来是这样的:反序列化JSON成几个C#一个子类

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

我想反序列化到对象的列表,其中每个对象为基础的一个子类此类。列表中的每个项目都有不同的属性(href,src,text),所以我不能使用同一个类来达到一个。相反,我想要一个普通类的三个子类。 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;} 
} 

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

EDIT:

我使用json.net的方式

+0

如何创建一个具有所有属性的类。反序列化以获取该类实例的列表。然后根据类型进行过滤并投影创建专用实例所需的属性。我认为这是你现在正在做的事情,并正在寻找更好的方法? – 2012-07-11 09:31:59

+0

随着应用程序的不断增长,单个项目的复杂性可能会增加,并且对于每个可能的属性都有一个基类似乎是个不错的主意。我正在考虑的是使用匿名对象,然后根据类型创建实例。 – Marius 2012-07-11 09:35:16

+0

我并不是指基类。我在考虑更多的中级dto课程,它有所有可能的选择。从dto对象列表中,您可以塑造所需的专用对象。这样,您的域名不必因序列化问题而混乱。那就是说,你可以使用动态对象?我没有意识到匿名类型可以让你不定义某些属性......因为在第一个反序列化的anon对象的属性不是第二个反序列化的anon对象将具有的属性。 – 2012-07-11 09:43:01

回答

1

由于@AmithGeorge建议,你可以使用一个dynamic对象动态解析您的JSON对象。您可以使用this great dynamic class for JSON by Shawn WeisfeldHere is his blog explaining how he do it

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); 
} 
+0

链接已死。你能找到并转发吗? - 谢谢! – 2016-11-03 12:19:39

+0

@DanVioletSagmiller对不起,我想他已经删除了他的存储库。您仍然可以按照我的第二个[链接]上的说明进行操作(http://www.drowningintechnicaldebt.com/ShawnWeisfeld/archive/2010/08/22/using-c-4.0-and-dynamic-to-parse-json.aspx )虽然。 – 2016-11-04 02:46:15