将包含字典的对象序列化,使得字典键/值作为所包含对象的一部分呈现

4

我有一个如下的类:

public class Usage
{
    public string app { get; set; }

    public Dictionary<string, string> KVPs { get; set; }
}

当我使用这段代码:
var json = new JavaScriptSerializer().Serialize(usage);

它给了我这个JSON:
{"app":"myapp", "KVPs":{"k1":"v1", "k2":"v2"}}

我希望它返回类似这样的内容:
{"app":"myapp", "k1":"v1", "k2":"v2"}

有没有一种方法可以做到这一点?我目前正在使用JavaScriptSerializer。如果有一种使用JSON.Net的方法,我愿意切换到该方法。


3
JavaScriptSerializer 不是 JSON.NET。 - Robert Levy
哦,抱歉,我原本使用的是JaveScriptSerializer,尝试用JSON.net替换它。谢谢。 - toosensitive
2个回答

9

如果你想使用 JSON.Net,并且愿意将字典的类型从 Dictionary<string, string> 改为 Dictionary<string, object>,那么实现这一点的简单方法之一是在你的字典属性上添加 [JsonExtensionData] 属性,像这样:

public class Usage
{
    public string app { get; set; }

    [JsonExtensionData]
    public Dictionary<string, object> KVPs { get; set; }
}

然后,您可以像这样对对象进行序列化:
string json = JsonConvert.SerializeObject(usage);

这将为您提供所需的JSON数据:
{"app":"myapp","k1":"v1","k2":"v2"}

而且好处是,如果需要的话,您可以轻松地将JSON反序列化回Usage类。 JSON中的任何未匹配到类成员的属性都将被放置在KVPs字典中。

Usage usage = JsonConvert.DeserializeObject<Usage>(json);

2

不太美观,但这样就可以解决问题了...

usage.KVPs["app"] = usage.app;
json = new JavaScriptSerializer().Serialize(usage.KVPs)

谢谢。那会起作用。 - toosensitive
如果这是您想接受的答案,请点击小勾勾图标。 - Robert Levy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接