2010-08-11 82 views
0

使用Json.NET開箱即用(取消)序列化通用字典似乎是不可能的。Json.NET和通用字典

class KeyClass 
{ 
    public KeyClass(string p1, string p2) { prop1 = p1; prop2 = p2;} 
    public string prop1 { get; set; } 
    public string prop2 { get; set; } 
} 

class ValueClass 
{ 
    public ValueClass(string pa, string pb) { propA = pa; propB = pb;} 
    public string propA { get; set; } 
    public string propB { get; set; } 
} 

... 

Dictionary<KeyClass, ValueClass> d = new Dictionary<KeyClass, ValueClass>(); 
d.Add(new KeyClass("k1", "k2"), new ValueClass("v1", "v2")); 
d.Add(new KeyClass("k3", "k4"), new ValueClass("v3", "v4")); 
string json = JsonConvert.SerializeObject(d); 

回報

{"ConsoleApplication1.KeyClass":{"propA":"v1","propB":"v2"}, 
"ConsoleApplication1.KeyClass":{"propA":"v3","propB":"v4"}} 

,我希望是這樣的:

{{"prop1":"k1","prop2":"k2"}:{"propA":"v1","propB":"v2"}, 
{"prop1":"k3","prop2":"k4"}:{"propA":"v3","propB":"v4"}} 

所以ToString()被稱爲上鍵(KeyClass)。 (生成json的重寫不會幫助:轉義json,但感覺不對)。

是否有可能爲這種情況寫一個CustomCreationConverter?
這是一個 json.NET的侷限性?
如果是這樣,其他圖書館是否支持這一點?

+0

好奇,你爲什麼不做「{」key「:」val「},這就是地圖應該用JSON表示的方式,最後我檢查了 – casperOne 2010-08-11 18:20:47

+0

@casperOne:這兩個類只是例子,嘗試'jsonify'包含更多的屬性:在我的情況下,KeyClass是表示語言的對象,ValueClass是表示該語言標籤的對象。 – jan 2010-08-11 18:58:14

回答

1

JSON中不支持你想要做的事情,它與JSON.NET沒什麼關係:「字典」(它被稱爲JSON中的對象)必須總是有字符串鍵。請看JSON specs

JSON.NET在這裏做的是處理C#字典的「正確」方式(另一個是拋出錯誤)。

請注意,JavaScript(其中JSON是一個非常受限制的子集)也不允許您提出的語法。

一種方法序列化通用詞典(或非通用詞典與非字符串鍵)是其序列作爲鍵 - 值對的列表,例如,

[ { "key": {"prop1":"k1","prop2":"k2"}, "value": {"propA":"v1","propB":"v2"} }, 
    { "key": {"prop1":"k3","prop2":"k4"}, "value": {"propA":"v3","propB":"v4"} } ] 

如何與JSON.NET是另一回事,但是如果可能的話,你可以嘗試將字典公開爲IEnumerable<KeyValuePair<X,Y>>