使用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"}}
因此在密钥(KeyClass)上调用ToString()
。 (生成json的覆盖没有帮助:逃避json并且感觉不对。)
是否可以为这种情况编写CustomCreationConverter?
这是json.NET的硬限制吗?
如果是这样,其他图书馆是否支持这个?
答案 0 :(得分:1)
JSON不支持你要做的事情,它与JSON.NET几乎没有关系:“字典”(它在JSON中称为对象)必须总是有字符串键。只需看看JSON specs。
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>>
。