在将Dictionary
从.NET标准WCF Web服务转移到.NET Core 2.0客户端(使用Newtonsoft Json)时,我偶然发现了一个差异。
服务界面如下:
[ServiceContract]
public interface ISomeService
{
[OperationContract]
[WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
SomeClass SomeWebMethod();
}
服务器端类如下:
[DataContract]
public class SomeClass
{
[DataMember]
public Dictionary<string, string> SomeDictionary { get; set; }
}
这会产生以下JSON响应:
{
"SomeDictionary": [
{
"Key": "some key",
"Value": "some value"
},
{
"Key": "some other key",
"Value": "some other value"
}
]
}
注意:WCF服务以Dictionary
- Key
方式序列化了Value
。
客户端类如下:
public class SomeClass {
public Dictionary<string, string> SomeDictionary { get; set; }
}
因此,服务器端和客户端类都是相同的(除了客户端缺少属性)。
但是,Web服务调用会产生以下错误:
“DeserializeResponse”失败了 “Newtonsoft.Json.JsonSerializationException:无法反序列化 当前的JSON数组(例如[1,2,3])成类型 “System.Collections.Generic.Dictionary`2 因为类型需要一个JSON对象(例如 {“name”:“value”} ) 正确地反序列化。
注意:客户端希望以Dictionary
- name
方式传递value
,这明显不同于服务器发送的方式 - 因此错误。
使用以下代码片段“手动”完成反序列化:
var obj = JsonConvert.DeserializeObject<SomeClass>(json);
如您所见,我在客户端类上没有任何属性,并且在执行反序列化时仅使用默认选项。
如何统一Dictionary
的(反)序列化?我可以在服务器端或客户端进行更改。
我能想到的唯一选择是彻底抛弃Dictionary
并在两端制作List
- Key
个自定义{。}}。