使用JSON.net序列化Dictionary <int,object>?</int,object>

时间:2012-04-17 18:39:30

标签: c# javascript json json.net

我正在尝试使用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变量?

我也对序列化词典的其他策略持开放态度。

1 个答案:

答案 0 :(得分:14)

这是为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”。

快乐的编码。