【问题标题】:Serialize Dictionary<int,object> using JSON.net?使用 JSON.net 序列化 Dictionary<int,object>?
【发布时间】:2012-04-17 18:39:30
【问题描述】:

我正在尝试使用 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"] 有效的。
  • 生成的 JSON 的消费者将是什么?如果它将是 javascript,那么只需使用 JSON.parse 将 JSON 反序列化回 JS 对象。
  • 啊,我明白了。那些是索引而不是变量?那么object[1] vs object.1?我的解释正确吗?
  • object["1"] 不是object[1]

标签: c# javascript json json.net


【解决方案1】:

这是为Dictionary&lt;int,...&gt; 生成 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&lt;int,...&gt;,那么它将自动处理到int、IIRC 的键中的转换。

我不知道有一种方法可以让 JSON.NET 直接生成非 JSON ;-) 它可以通过循环顶层构造来完成,例如每个 KeyValuePair&lt;int,...&gt; 并为每个单独的条目生成 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”。

编码愉快。

【讨论】:

  • 我能够从上面的 cmets 和一些研究中解出很多东西,但得到一个非常具体的解释总是很高兴。谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 2015-11-07
  • 2017-09-03
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多