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

时间:2014-08-12 12:13:18

标签: c# winforms json.net propertygrid

当我尝试使用JSON.net来序列化我的自定义数据类时出现问题 - 基本类型的属性被正确序列化,但是类本身的属性将被序列化为字符串(完整类型名称,没有否则,没有实际值。)

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

1 个答案:

答案 0 :(得分:4)

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

第一个解决方案来自JSON.Net方面 - 按照here所述实现您自己的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。