2012-04-17 50 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