2016-08-12 115 views
2

假設有關文檔的信息存儲在條形碼中,並且信息的結構根據文檔的類型而不同。但是文件的類型事先是未知的;條形碼告訴我們,什麼樣的文件,我們正在處理:JsonConvert.DeserializeObject在C#中只有所需對象的字符串名稱已知

條碼值不會存放分隔字符串是這樣的:

author|date|subject 
author|date|subject|approvedby1;approvedby2 

但會包含JSON對象:

FOO|{"author": "Smokey", "date": "01/01/2015", "subject": "widgets"} 

GOO|{"author": "Smokey", "date": "01/01/2015", "subject": "widgets", "approvals": ["Mike","Jane"]} 

當我們獲取條形碼文本數據,我們從|定界符左側的值中看到,我們需要實例化FOOGOO。我們抓住|右側的字符串並將其送到JsonConvert

如何告訴JsonConvert.DeserializeObject<some type>從其json表示中返回一個GOO對象?

var myGoo = JsonConvert.DeserializeObject<?>(jsonStringGOO) 

尖括號之間的內容< >

編輯:理想情況下,不訴諸於switch語句。

我們假設當前命名空間包含所有可能類型的類定義。

回答

2

如何嘗試使用反射

var data = input.Split('|'); 

var assembly = Assembly.LoadFrom("MyDll.dll"); 

var myType = assembly.GetType("My.Namespace." + data[0]); // GOO/BAR/etc 

JsonConvert.DeserializeObject(data[1], myType) 

Assembly.GetType(string name)

JsonConvert.DeserializeObject(string value, Type type)

注:獲得組件的類型對於調試,你可以使用這樣的代碼得到類型的全名

var t = typeof(Goo); 
Debug.WriteLine(t.FullName); 
+0

我已經很少使用Reflection了,並且在Assembly.GetType行上得到一個錯誤,指出「非靜態字段需要對象引用,方法,或者屬性Assembly.GetType(string)'。必須實例化哪個反射對象? – Tim

+0

對不起 - 編輯 –

+0

謝謝。 「MyAssembly」後面的引號是否在內部或外部?我假設「+」。「 +'是嗎? – Tim

0

假設你有一個名爲GOO的類,呼叫的類型在括號之間。但是,你必須根據類型進行切換:

class GOO { 
    string author { get; set; } 
    string date { get; set; } 
    // ... 
} 

class FOO { 
    // ... 
} 

object parse(string barcode) { 
    int pos = barcode.IndexOf('|'); 
    string type = barcode.substring(0,pos); 
    string obj = barcode.substring(pos+1); 
    switch(type) { 
    case "GOO": return JsonConvert.DeserializeObject<GOO>(obj); 
    case "FOO": return JsonConvert.DeserializeObject<FOO>(obj); 
    default: return null; // unknown type 
    } 
} 
+0

有沒有辦法做到這一點沒有switch語句?我將編輯我的問題。 – Tim

+0

您也可以使用反射按名稱查詢類型,並使用該類型信息構建泛型方法。這將工作,無需switch語句等,並可擴展而無需重新編譯 – Charleh

-1

相信this可以幫助你:只要抓住類型名稱,通過反射獲取類型實例,並把它放到泛型類型。

0

你真的需要有不同的對象嗎?

因爲您可以使用具有所有可能屬性的單個對象,並且未收到的屬性將被填充,就像空白(或假)一樣。

我試圖添加一個List<string>財產的應用程序我有誰收到JSON和效果是該屬性具有空值。

相關問題