使用字典反序列化JSON作为属性结果为null .NET Dictionary <string,string> </string,string>

时间:2014-11-14 23:51:51

标签: .net json serialization dictionary

我定义了一个WCF Web服务方法,其中一个参数dictDictionary<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

2 个答案:

答案 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中的反序列化器没有。不确定为什么 - 或者为什么从未解决过这个问题 - 但是你就是这样。我找到了一些实施替代反序列化器的文章,但选择不去那条路。