【问题标题】:Can't Deserialize a Nullable KeyValuePair from JSON with ASP.NET AJAX无法使用 ASP.NET AJAX 从 JSON 反序列化可为空的 KeyValuePair
【发布时间】:2010-12-19 14:35:51
【问题描述】:

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

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

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

将属性类型更改为KeyValuePair&lt;string,string&gt; 可以解决问题,但如果可能的话,我想保留Nullable 类型。

JSON 正是您所期望的:

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

帮助?

【问题讨论】:

  • KeyValuePair 的反序列化并没有修复上面的错误,但实际上导致了对的两个空字符串。即,反序列化导致数据丢失。所以上面的JSON变成了[,]的KeyValuePair!

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


【解决方案1】:

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

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

您将能够通过创建实现JavaScriptConverterRegistering It 的类来解决此问题和空问题。我已经使用下面的代码来处理标准的 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>) }; }
    }
}

您也可以创建一个简单的类,它有两个属性 key 和 value。

【讨论】:

  • 感谢您的回答。我已经为这个问题苦苦挣扎了很长一段时间,但我无法弄清楚为什么几乎所有其他数据类型都可以工作,但 KeyValuePair 却不行。再次感谢,这是一个直截了当且非常有帮助的回复。
  • 我想知道,在 MVC 3 的上下文中:有没有办法注册这个转换器,以便所有 JSON 模型绑定都可以访问这个转换器?使用特定的 JavaScriptSerializer 实例注册转换器并不能很好地适应 MVC 3 模型绑定。
【解决方案2】:

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

我已经使用它成功地 Json 序列化和反序列化了可为空的 KeyValue 对。

【讨论】:

    猜你喜欢
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多