有什么方法可以使DataContractJsonSerializer正确序列化字典?

时间:2010-12-30 04:24:18

标签: .net wcf serialization

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

4 个答案:

答案 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,在这种情况下,您可以完全控制序列化。这样,您可以使用JavaScriptSerializerJSON.NETServiceStack.JSON来执行实际的序列化,这些序列化程序实际上以更合理的方式处理字典。

答案 3 :(得分:7)

DataContractJsonSerializerSettings现在拥有UseSimpleDictionaryFormat属性,并按照您期望的方式序列化字典。