使用默认转换器的自定义Json转换器
本文关键字:转换器 自定义 Json 默认 | 更新日期: 2023-09-27 18:06:10
我有一个使用JSON的c#应用程序。这里有个bug,有点复杂,所以我举个例子。如果我们有这个类:
public class FatherObj
{
public SonObj Son {get; set;}
}
public class SonObj
{
public List<GrandChildObj> GrandChildren {get; set;}
}
然后,当与JSON对象FatherObj反序列化时,对象SonObj中的孙子列表被复制。我通过在列表声明上方添加以下代码来修复它:
[JsonProperty(ObjectCreationHandling = ObjectCreationHandling.Replace)]
但是,当我尝试将其添加到整个应用程序的JSON序列化设置中时,它会引起问题。所以,我决定制作一个JsonConverter,它只适用于List对象,当反序列化时,它将在返回之前调用Distinct方法。但是,JsonConverter是一个抽象类,所以当实现它的方法时,你不能调用任何基方法(因为它们也是抽象的)。如何调用默认的转换器设置?我不想创建不同的转换,除了不同的。
好的,所以在用户dbc的帮助下进行了一些搜索之后-我从不同的链接中得到了他的答案:如何应用ObjectCreationHandling。在反序列化JSON时替换选定的属性?
他在链接中发布的解决方案:使用以下代码创建自定义ContractResolver(继承自DefaultContractResolver):
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var jsonProperty = base.CreateProperty(member, memberSerialization);
if (jsonProperty.ObjectCreationHandling == null && jsonProperty.PropertyType.GetListType() != null)
jsonProperty.ObjectCreationHandling = ObjectCreationHandling.Replace;
return jsonProperty;
}
public static class TypeExtensions
{
public static Type GetListType(this Type type)
{
while (type != null)
{
if (type.IsGenericType)
{
var genType = type.GetGenericTypeDefinition();
if (genType == typeof(List<>))
return type.GetGenericArguments()[0];
}
type = type.BaseType;
}
return null;
}
}