JSON.将类类型序列化为类型名称而不是值的Net属性

本文关键字:类型 Net 属性 序列化 JSON | 更新日期: 2023-09-27 18:17:42

当我尝试使用JSON.net序列化我的自定义数据类时,我遇到了一个问题-基本类型的属性被正确序列化,但类本身的属性将被序列化为字符串(完整类型名称而不是其他任何内容,没有实际值)。

Assembly.LoadFrom(file)动态加载类类型,然后用TypeDescriptor.AddAttributes装饰属性类型以添加ExpandableObjectConverter -这允许WinForms Property Grid控件扩展它们并设置它们的内部值。

JSON.将类类型序列化为类型名称而不是值的Net属性

这里的问题确实是TypeConverter[typeof(ExpandableObjectConverter)]。JSON。Net的DefaultContractResolver将检索类型转换器并调用CanConvertTo(typeof(string)),这将返回true,因此它将对该类型使用StringContract -它将被序列化为字符串。

第一个解决方案来自JSON。Net端-实现您自己的ContractResolver,如下所述。然后,您可以像这样重写CreateContract,并始终为使用TypeConverter属性装饰的类型提供正确的Contract:

protected override JsonContract CreateContract(Type objectType)
{
   if (TypeDescriptor.GetAttributes(objectType).Contains(new TypeConverterAttribute(typeof(ExpandableObjectConverter))))
   {
       return this.CreateObjectContract(objectType);
   }
   return base.CreateContract(objectType);
}

第二个解决方案是创建自己的ExpandableObjectConverter,并覆盖它的CanConvertTo方法以返回false的字符串-这就是JSON。Net调用,因此不会认为它是StringContract,而会返回到ObjectContract。