0

使用 Json.NET 开箱即用(反)序列化通用字典似乎是不可能的。

class KeyClass
{
    public KeyClass(string p1, string p2) { prop1 = p1; prop2 = p2;}
    public string prop1 { get; set; }
    public string prop2 { get; set; }
}

class ValueClass
{
    public ValueClass(string pa, string pb) { propA = pa; propB = pb;}
    public string propA { get; set; }
    public string propB { get; set; }
}

...

Dictionary<KeyClass, ValueClass> d = new Dictionary<KeyClass, ValueClass>();
d.Add(new KeyClass("k1", "k2"), new ValueClass("v1", "v2"));
d.Add(new KeyClass("k3", "k4"), new ValueClass("v3", "v4"));
string json = JsonConvert.SerializeObject(d);

返回

{"ConsoleApplication1.KeyClass":{"propA":"v1","propB":"v2"},
 "ConsoleApplication1.KeyClass":{"propA":"v3","propB":"v4"}}

我期望的地方是:

{{"prop1":"k1","prop2":"k2"}:{"propA":"v1","propB":"v2"},
 {"prop1":"k3","prop2":"k4"}:{"propA":"v3","propB":"v4"}}

所以ToString()在键(KeyClass)上调用。(生成 json 的覆盖没有帮助:转义 json 并且感觉不对)。

是否可以为这种情况编写 CustomCreationConverter ?
这是json.NET的硬性限制吗?
如果是这样,其他库是否支持这个?

4

1 回答 1

1

JSON 不支持您尝试执行的操作,它与 JSON.NET 几乎没有关系:“字典”(在 JSON 中称为对象)必须始终具有字符串键。只需查看JSON 规范

JSON.NET 在这里所做的是一种处理 C# 字典的“正确”方式(另一种是抛出错误)。

请注意,JavaScript(其中 JSON 是一个非常受限的子集)也不允许您建议的语法。

序列化泛型字典(或具有非字符串键的非泛型字典)的一种方法是将其序列化为键值对列表,例如,

[ { "key": {"prop1":"k1","prop2":"k2"}, "value": {"propA":"v1","propB":"v2"} },
  { "key": {"prop1":"k3","prop2":"k4"}, "value": {"propA":"v3","propB":"v4"} } ]

如何使用 JSON.NET 是另一回事,但如果可能的话,您可以尝试将字典公开为IEnumerable<KeyValuePair<X,Y>>.

于 2010-08-11T19:44:21.147 回答