使用默认转换器的自定义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是一个抽象类,所以当实现它的方法时,你不能调用任何基方法(因为它们也是抽象的)。如何调用默认的转换器设置?我不想创建不同的转换,除了不同的。

使用默认转换器的自定义Json转换器

好的,所以在用户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;
    }
}