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

时间:2014-02-28 21:02:56

标签: c# json dictionary serialization json.net

我有一个课程如下:

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做到这一点,我愿意切换到那个。

2 个答案:

答案 0 :(得分:9)

如果您想使用JSON.Net并且您愿意将字典类型从Dictionary<string, string>更改为Dictionary<string, object>,那么实现此目的的一种简单方法是添加{{1像这样的字典属性的属性:

[JsonExtensionData]

然后你可以这样序列化你的对象:

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

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

这将为您提供所需的JSON:

string json = JsonConvert.SerializeObject(usage);

奖励是,如果需要,您可以轻松地将JSON反序列化回{"app":"myapp","k1":"v1","k2":"v2"} 课程。 JSON中与该类成员不匹配的任何属性都将放入Usage字典中。

KVPs

答案 1 :(得分:2)

不漂亮,但这可行......

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