以下类不使用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"
}
}}
帮助?
答案 0 :(得分:4)
发生这种情况的原因是,当JavaScriptSerializer尝试反序列化时,它将创建该类的新实例(在此KeyValuePair中),然后将值分配给属性。
这会导致问题,因为KeyValuePair只能将键和值分配为构造函数的一部分而不是通过属性,因此会产生空键和值。
您可以通过创建实现JavaScriptConverter和Registering 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对进行序列化和反序列化。