将字典序列化为数组(键值对)
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() } )