DataContractJsonSerializer无法正确序列化词典。
JavaScriptSerializer将字典序列化为{"abc":"xyz","def":42}
例如,
DataContractJsonSerializer代替[{"Key":"abc","Value":"xyz"},{"Key":"def","Value":42}]
。
这确实有问题,我想知道如何在WCF服务中正确序列化Dictionary对象。我正在寻找一种需要最少努力的解决方案。
参考:http://msdn.microsoft.com/en-us/library/bb412170.aspx
这是我最终在WCF中正确使用字典串行化的解决方法:http://social.msdn.microsoft.com/forums/en-US/wcf/thread/765f1569-0422-4471-8ec2-1d03b2026771
答案 0 :(得分:53)
使用DataContractJsonSerializerSettings(自.NET 4.5起可用)可以为您完成此任务:
var serializer = new DataContractJsonSerializer(typeOfObj, new DataContractJsonSerializerSettings()
{
UseSimpleDictionaryFormat = true
});
答案 1 :(得分:29)
不幸的是,根据http://msdn.microsoft.com/en-us/library/bb412170.aspx
上的“收藏,词典和数组”一节,这似乎是按照设计进行的。所有集合,词典和数组都以JSON形式表示为数组。
答案 2 :(得分:9)
虽然这在大多数情况下都会导致重写,因此不可行,您可以让WCF服务接口接受并返回Stream
,在这种情况下,您可以完全控制序列化。这样,您可以使用JavaScriptSerializer
,JSON.NET或ServiceStack.JSON来执行实际的序列化,这些序列化程序实际上以更合理的方式处理字典。
答案 3 :(得分:7)
DataContractJsonSerializerSettings
现在拥有UseSimpleDictionaryFormat
属性,并按照您期望的方式序列化字典。