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

Any way to make DataContractJsonSerializer serialize Dictionaries properly?

提问人:morpheus 提问时间:12/30/2010 最后编辑:jordanhill123morpheus 更新时间:5/27/2016 访问量:50861

问:

DataContractJsonSerializer 无法正确序列化字典。

而 JavaScriptSerializer 序列化 Dictionaries 例如, DataContractJsonSerializer 提供。{"abc":"xyz","def":42}[{"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

.NET WCF 序列化

评论

1赞 Mehmet K 10/24/2014
如果您没有使用 Json.NET,请参阅以下内容:stackoverflow.com/questions/7498208/...

答:

29赞 Josh 12/30/2010 #1

不幸的是,这似乎是设计使然,根据 http://msdn.microsoft.com/en-us/library/bb412170.aspx 的“集合、字典和数组”部分

所有集合、字典和数组在 JSON 中都表示为数组。

10赞 faester 11/3/2011 #2

尽管在大多数情况下,这将导致重大重写,因此不可行,但您可以让 WCF 服务接口接受并返回,在这种情况下,您可以完全控制序列化。这样,您可以使用 、 JSON.NETServiceStack.JSON 来执行实际的序列化,并且这些序列化程序实际上以更明智的方式处理字典。StreamJavaScriptSerializer

评论

0赞 Markus Bruckner 10/1/2012
你的意思是字符串而不是流吗?
3赞 faester 10/1/2012
@Markus:不,我没有。字符串不允许您控制序列化,它为方法提供一个签名,强制执行某种 stirng 输入,而按照约定,它指示 WCF 您要控制序列化。我不认为这两种解决方案是可以互换的。Stream
0赞 Markus Bruckner 10/2/2012
嗯。。。我假设字符串的返回类型也不会被处理,但情况似乎并非如此?否则,使用流而不是字符串将笨拙,IMO。
1赞 faester 10/2/2012
我想这取决于:如果您使用的是 Xml 样式序列化,它将被包装。Json(当然是这个问题的支点)可能是另一个问题,因为你可能会让它工作。这不会改变 WCF 对 Streams 作为输入和返回类型的特殊使用。这主要是由于性能问题,但对序列化的控制也是一个点。(WCF 只是停止所有序列化拦截,并留给您为什么它也比让 WCF 拦截您建议的字符串更快,然后您执行不同的序列化。
1赞 Josh 11/12/2012
正确,Stream 的性能将优于字符串(因为字符串不会受到序列化阶段的约束),并且将逐字节保证有效负载通过 WCF 格式设置和序列化保持不变。当然,其他阶段可以修改它,但就序列化而言就不行了。这是解决问题的务实方法。
8赞 Colin 11/21/2014 #3

DataContractJsonSerializerSettings现在拥有该属性,它以您期望的方式序列化字典。UseSimpleDictionaryFormat

评论

3赞 flayn 9/26/2017
在代码中创建服务主机时,在哪里可以将“普通”序列化程序替换为此序列化程序?
64赞 Mr.Wang from Next Door 12/1/2014 #4

使用 DataContractJsonSerializerSettings(自 .NET 4.5 起可用)可以为您执行此操作:

var serializer = new DataContractJsonSerializer(typeOfObj, new DataContractJsonSerializerSettings()
{
    UseSimpleDictionaryFormat = true 
});

评论

2赞 flayn 9/5/2017
嗨,当我在代码中创建服务主机时,我在哪里可以用这个序列化器替换“普通”序列化程序?