无法使用ASP.NET AJAX从JSON反序列化Nullable KeyValuePair

时间:2009-11-23 19:06:32

标签: asp.net json asp.net-ajax serialization nullable

以下类不使用System.Web.Script.Serialization.JavaScriptSerializer反序列化(但会序列化)。

public class foo {
  public KeyValuePair<string, string>? bar {get;set;}
}

System.NullReferenceException到达System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject属性时,尝试反序列化会产生bar。 (注意,这是基于堆栈跟踪的推测。)

将属性类型更改为KeyValuePair<string,string>可以解决问题,但我希望尽可能保留Nullable类型。

JSON正是您所期望的:

{"foo": {
  "bar": {
    "Key":"Jean-Luc",
    "Value":"Picard"
  }
}}

帮助?

2 个答案:

答案 0 :(得分:4)

发生这种情况的原因是,当JavaScriptSerializer尝试反序列化时,它将创建该类的新实例(在此KeyValuePair中),然后将值分配给属性。

这会导致问题,因为KeyValuePair只能将键和值分配为构造函数的一部分而不是通过属性,因此会产生空键和值。

您可以通过创建实现JavaScriptConverterRegistering It的类来解决此问题和null问题。我使用下面的代码来处理标准的KeyValuePair,但我相信你可以扩展它以处理空值。

public class DictionaryJavaScriptConverter<k, v> : JavaScriptConverter
{

    public override object Deserialize(System.Collections.Generic.IDictionary<string, object> dictionary, System.Type type, System.Web.Script.Serialization.JavaScriptSerializer serializer)
    {
        return new KeyValuePair<k, v>((k)dictionary["Key"], (v)dictionary["Value"]);
    }

    public override System.Collections.Generic.IDictionary<string, object> Serialize(object obj, System.Web.Script.Serialization.JavaScriptSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override System.Collections.Generic.IEnumerable<System.Type> SupportedTypes {
        get { return new System.Type[] { typeof(KeyValuePair<k, v>) }; }
    }
}

或者,您可以创建一个具有两个属性键和值的简单类。

答案 1 :(得分:0)

你可以看看这个包装器: http://www.codeproject.com/KB/aspnet/Univar.aspx

我已成功使用Json对可空的KeyValue对进行序列化和反序列化。