我定义了一个WCF Web服务方法,其中一个参数dict
是Dictionary<string,string>
:
public Models.ActEntry Create(string userName, int codeNo, int typeNo, int relatedPkey, DateTime createTime, string info, Dictionary<string, string> dict)
提供给IIS的JSON如下(注意:sUser的值由身份验证层提供):
{"codeNo":100,"typeNo":1,"relatedPkey":269222839,"createTime":"\/Date(1416002315864)\/","info":"something","dict":{"one":"first","two":"second","three":"third"}}
JSON很高兴反序列化而没有错误,但dict
的值为null(Count = 0
)。所有其他属性都被正确反序列化。我可以在跟踪日志中清楚地看到IIS识别dict
并正确地将其键入为对象但是当我查看方法中的Dictionary<string,string>
变量dict
时,它为空。
[HttpRequest] Method POST
[HttpRequest] Content-Length 161
[HttpRequest] Content-Type application/json; charset=utf-8
[HttpRequest] Authorization Basic ZHNcYmFybmVzcjpSZWN0MWYxZXI=
[HttpRequest] Expect 100-continue
[HttpRequest] Host **************
[HttpRequest] X-FECTransaction 63dc8855-e55d-48b0-b31b-ec44ea52b56e
[root] [root] type object
[root] [codeNo] type number
[root] codeNo 100
[root] [typeNo] type number
[root] typeNo 1
[root] [relatedPkey] type number
[root] relatedPkey 269222839
[root] [info] type string
[root] info something
[root] [createTime] type string
[root] createTime /Date(1416002315864)/
[root] [dict] type object
[root] [one] type string
[root] one first
[root] [two] type string
[root] two second
[root] [three] type string
[root] three third
答案 0 :(得分:1)
这是在DataContract Serializer中完成的。也许你可以使用它: 添加到DataContract类DataMember属性。然后对用于对象的预期类型使用KnownType属性。在以下示例中,我在集合中使用int或bool:
[DataContract]
[KnownType(typeof(int[]))]
[KnownType(typeof(bool[]))]
public class CompositeType
{
[DataMember]
public object UsedForKnownTypeSerializationObject;
[DataMember]
public string StringValue
{
get;
set;
}
[DataMember]
public Dictionary<string, object> Parameters
{
get;
set;
}
}
答案 1 :(得分:0)
提供此信息以供将来参考:根据以下段落(来自Stand-Alone JSON Serialization),WCF无法直接反序列化字典&lt;&gt;:
字典不是直接使用JSON的方法。 在WCF中可能不支持字典相同的方式 正如使用其他JSON技术所期望的那样。例如,如果 “abc”映射到“xyz”,“def”映射到字典中的42, JSON表示不是{“abc”:“xyz”,“def”:42}但是 [{“Key”:“abc”,“Value”:“xyz”},{“Key”:“def”,“Value”:42}]而不是。
我确认.Serialization.JavaScriptSerializer处理字典就好了。但是WCF中的反序列化器没有。不确定为什么 - 或者为什么从未解决过这个问题 - 但是你就是这样。我找到了一些实施替代反序列化器的文章,但选择不去那条路。