2012-07-11 36 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