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

too*_*ive 4 c# serialization json dictionary json.net

我有一个课程如下:

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

    public Dictionary<string, string> KVPs { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我使用这段代码时:

var json = new JavaScriptSerializer().Serialize(usage);
Run Code Online (Sandbox Code Playgroud)

它给了我这个JSON:

{"app":"myapp", "KVPs":{"k1":"v1", "k2":"v2"}}
Run Code Online (Sandbox Code Playgroud)

我想要它返回这样的东西:

{"app":"myapp", "k1":"v1", "k2":"v2"}
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?我目前正在使用JavaScriptSerializer.如果有办法使用JSON.Net做到这一点,我愿意切换到那个.

Bri*_*ers 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; }
}
Run Code Online (Sandbox Code Playgroud)

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

string json = JsonConvert.SerializeObject(usage);
Run Code Online (Sandbox Code Playgroud)

这将为您提供所需的JSON:

{"app":"myapp","k1":"v1","k2":"v2"}
Run Code Online (Sandbox Code Playgroud)

奖励是,Usage如果需要,您可以轻松地将JSON反序列化回您的班级.JSON中与该类成员不匹配的任何属性都将放入KVPs字典中.

Usage usage = JsonConvert.DeserializeObject<Usage>(json);
Run Code Online (Sandbox Code Playgroud)