2014-07-01 57 views
17

我有一個自定義.net類型的字典作爲其key.I嘗試使用JSON.net將此字典序列化爲JSON,但它無法將密鑰轉換爲序列化過程中的正確值。不能使用JSON.net序列化帶有複雜鍵的字典

class ListBaseClass 
{ 
    public String testA; 
    public String testB; 
} 
----- 
var details = new Dictionary<ListBaseClass, string>(); 
details.Add(new ListBaseClass { testA = "Hello", testB = "World" }, "Normal"); 
var results = Newtonsoft.Json.JsonConvert.SerializeObject(details); 
var data = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<ListBaseClass, string>> results); 

這給我 - > 「{\」 JSonSerialization.ListBaseClass \ 「:\」 正常\ 「}」

但是,如果我有我的自定義類型的字典值效果很好

var details = new Dictionary<string, ListBaseClass>(); 
    details.Add("Normal", new ListBaseClass { testA = "Hello", testB = "World" }); 
    var results = Newtonsoft.Json.JsonConvert.SerializeObject(details); 
    var data = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, ListBaseClass>>(results); 

這給我 - > 「{\」 正常\ 「:{\」 種皮\ 「:\」 你好\ 「\ 」TESTB \「:\ 」世界\「}}」

有人可以建議如果我碰到Json.net的某些限制或我做錯了什麼?

回答

14

Serialization Guide狀態(參見:字典和哈希表;感謝你@Shashwat的鏈接):

當序列化一個字典,字典的鍵 轉換爲字符串並作爲JSON對象屬性名稱。可以通過覆蓋 ToString()作爲密鑰類型或通過實現TypeConverter來自定義爲密鑰編寫的 字符串。 A 當反序列化字典時,TypeConverter還將支持再次將自定義字符串轉換回 。

我找到了如何實現對微軟的這種類型轉換器一個有用的例子,「如何做」的頁面:

從本質上講,我需要延長System.ComponentModel.TypeConverter並重寫:

bool CanConvertFrom(ITypeDescriptorContext context, Type source); 

object ConvertFrom(ITypeDescriptorContext context, 
        System.Globalization.CultureInfo culture, object value); 

object ConvertTo(ITypeDescriptorContext context, 
       System.Globalization.CultureInfo culture, 
       object value, Type destinationType); 

它也有必要屬性[TypeConverter(typeof(MyClassConverter))]添加到MyClass類的聲明。

有了這些,我可以自動地序列化和反序列化字典

+0

這對我們有效,解決複雜的字典鍵的問題。如果泛型類在類嵌套中使用了不同的具體實現,我們的自定義JsonConverter無法在複雜關鍵類上使用declarative屬性 - 我們不得不將它作爲參數傳遞給JsonConvert.SerializeObject,但不太理想。 – mungflesh

+0

我也剛剛得到這個複雜的字典鍵類型的工作。注意別人 - 這是獨立於JSON.Net包中的JSONTypeConverter的東西。另外,還沒有需要用於此的JSON設置。這個答案確實確實包含你需要做的事情。我發現最初在重寫函數內部放置斷點,以更好地理解它們何時被使用以及它們被要求做什麼是有用的。 – DaveInCaz

+0

很好的答案,即使它不適用於我,因爲我使用Windows Phone 8.1,其中System.ComponentModel.TypeConverter不受支持。 – user3141326

相關問題