将字典序列化为数组(键值对)

Json.Net通常将Dictionary序列化为集合;

 "MyDict": { "Apples": { "Taste": 1341181398, "Title": "Granny Smith", }, "Oranges": { "Taste": 9999999999, "Title": "Coxes Pippin", }, } 

哪个好。 从环顾四周看似乎是大多数人想要的东西。 但是,在这种特殊情况下,我想在我的Dictionary和Array格式之间进行序列化;

 "MyDict": [ "k": "Apples", "v": { "Taste": 1341181398, "Title": "Granny Smith", } }, "k:": "Oranges", "v:": { "Taste": 9999999999, "Title": "Coxes Pippin", } }, ] 

使用现有的字段类型有一种简单的方法吗? 有没有我可以注释的属性?

另一种方法是使用自定义ContractResolver 。 这样,您不必在每次序列化时子类化Dictionary也不应用变换,如其他答案中所建议的那样。

以下解析程序将使所有字典序列化为具有“键”和“值”属性的对象数组:

 class DictionaryAsArrayResolver : DefaultContractResolver { protected override JsonContract CreateContract(Type objectType) { if (objectType.GetInterfaces().Any(i => i == typeof(IDictionary) || (i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IDictionary<,>)))) { return base.CreateArrayContract(objectType); } return base.CreateContract(objectType); } } 

要使用解析器,请将其添加到JsonSerializerSettings ,然后将设置传递给JsonConvert.SerializeObject()如下所示:

 JsonSerializerSettings settings = new JsonSerializerSettings(); settings.ContractResolver = new DictionaryAsArrayResolver(); string json = JsonConvert.SerializeObject(obj, settings); 

这是一个工作演示 。

啊,事实certificate这和我希望的一样简单。 我的Dictionary已经是子类,我发现我可以用[JsonArrayAttribute]注释它。 这给了我完全我需要的格式;

 "MyDict": [ { "Key": "Apples", "Value": { "Taste": 1341181398, "Title": "Granny Smith", } }, { "Key:": "Oranges", "Value:": { "Taste": 9999999999, "Title": "Coxes Pippin", } }, ] 

对于这个例子,我将使用dictonary:

 var myDict = new Dictionary() { {"a","123"}, {"b","234"}, {"c","345"} }; 

序列化(使用Newtonsoft.Json.JsonConvert.SerializeObject(myDict) ):

 {"a":"123","b":"234","c":"345"} 

您可以使用LINQ进行转换以创建匿名对象,并序列化:

  var myDictTransformed = from key in myDict.Keys select new { k = key, v = myDict[key] }; 

或者你可以使用一个真实的对象

 class MyDictEntry { public string k { get; set; } public string v { get; set; } } 

以及上面或替代的LINQ语法:

 var myDictTransformed = myDict.Keys.AsEnumerable() .Select(key => new MyDictEntry{ k = key, v = myDict[key] }); 

无论哪种方式,这序列化为:

 [ {"k":"a", "v":"123"}, {"k":"b", "v":"234"}, {"k":"c", "v":"345"} ] 

.NET小提琴链接: https : //dotnetfiddle.net/LhisVW

我找到的最简单的解决方案是将Dictionary转换为List> 。 然后,JSON.NET将List转换为具有{ Key: 'keyname', Value: 'value' }forms的对象数组。 如果您接受所需的模型更改并且不想为您的Dictionary子类,则此方法很有效。

gregmac的回答很有帮助,但没有奏效。 以下是相同的想法……没有双关语。

 var dictionaryTransformed = dictionary.Select(item => item.Key).Select(i => new {Key = i, Value = dictionary[i] }); 

当然

 var dictionaryTransformed = dictionary.Select(item => new {item.Key, Value = dictionary[item.Key] }); 

然后去json

 var json = (new JavaScriptSerializer()).Serialize( new { Container = dictionaryTransformed.ToArray() } )