8

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

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

4

1 回答 1

20

这是生成 JSON 的正确方法Dictionary<int,...>。原因是JSON要求所有键都是带引号的字符串文字

JS 在这方面稍微宽松一点:但是 JSON 是 JS 对象字面量的一种受限形式。无论如何,JavaScript 中的所有属性名称都是字符串。(它们会根据需要进行隐式转换。)因此,({1: 2})["1"])并且({"1": 2})[1])在 JS 中同样有效(并且都计算为2),但只有{"1": 2}有效的 JSON。

如果要反序列化回的目标类型是,Dictionary<int,...>那么它将自动处理到intIIRC 的键中的转换。

我不知道有一种方法可以让 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”。

快乐编码。

于 2012-04-17T21:55:06.637 回答