2012-04-17 23 views
4

我正在嘗試使用JSON.net序列化字典。序列化字典<int,object>使用JSON.net?

使用

JsonConvert.SerializeObject(theDict); 

這裏是我的結果

{ 
    "1": { 
    "Blah1": false, 
    "Blah2": false, 
    "Blah3": "None", 
    "Blah4": false 
    }, 
    "2": { 
    "Blah1": false, 
    "Blah2": false, 
    "Blah3": "None", 
    "Blah4": false 
    }, 
    "3": { 
    "Blah1": false, 
    "Blah2": false, 
    "Blah3": "None", 
    "Blah4": false 
    }, 
    ... 
    ... 
    ... 
} 

有沒有辦法序列化此字典使得按鍵呈現爲有效的JavaScript變量?

我也打開序列化字典的其他策略。

+2

它們是有效的。您希望輸出看起來像什麼? – Ryan 2012-04-17 18:41:29

+2

從技術上講,你的變量[「1」] *是有效的。 – Tejs 2012-04-17 18:41:43

+1

什麼是生產的JSON的消費者?如果它將是JavaScript,那麼只需使用'JSON.parse'將JSON反序列化爲一個JS對象。 – 2012-04-17 18:51:51

回答

11

這是爲Dictionary<int,...>生成JSON的正確方法。原因是JSON requires that all keys are quoted-string literals

JS在這方面稍微放鬆一點:但JSON是JS對象文字的限制形式。在任何情況下,JavaScript中的所有屬性名稱均爲字符串。 (它們根據需要被隱式轉換。)因此,({1: 2})["1"])({"1": 2})[1])在JS中同樣有效(並且都評估爲2),但只有{"1": 2}是有效的JSON。

如果要反序列化的目標類型爲Dictionary<int,...>那麼它會自動處理關鍵字到int,IIRC的轉換。

我不知道如何讓JSON.NET直接生成非JSON ;-)可以通過循環頂層構造來完成,例如,每個KeyValuePair<int,...>和生成的JSON的「修改」 JS代碼沿每一單個條目:

foreach (var p in dict) { 
    var k = p.Key; 
    var v = p.Value; 
    Emit(string.Format(
     "var name{0} = {1};", 
     k, JsonConvert.SerializeObject(v))); 
} 

哪裏Emit是無論是用於收集輸出......我會建議「只是正常的JSON」如果在所有儘管如此。

快樂編碼。

+2

我能夠從上面的評論和一些研究中找出儘可能多的東西,但總能得到一個非常具體的解釋。謝謝! – 2012-04-17 22:39:41

相關問題