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

时间:2016-09-07 07:20:24

标签: c# .net json json.net

我有一个使用JSON的C#应用​​程序。有一个bug,它有点复杂,所以我举个例子。 如果我们有这个课程:

public class FatherObj
{
     public SonObj Son {get; set;}
}

public class SonObj
{
     public List<GrandChildObj> GrandChildren {get; set;}
}

然后,当使用JSON对象FatherObj进行反序列化时,对象SonObj中的GrandChildren列表将被复制。我通过在列表的声明上面添加以下代码来修复它:

[JsonProperty(ObjectCreationHandling = ObjectCreationHandling.Replace)]

但是,当我尝试将其添加到整个应用程序的JSON序列化设置时,它会导致问题。 因此,我决定创建一个仅适用于List对象的JsonConverter,并且在反序列化时将在返回之前调用Distinct方法。 但是,JsonConverter是一个抽象类,所以在实现它的方法时,你不能调用任何基本方法(因为它们也是抽象的)。 如何调用默认转换器设置?除了distinct之外,我不想创建不同的转换。

1 个答案:

答案 0 :(得分:1)

好的,所以在用户dbc的帮助下进行了一些搜索之后 - 我从不同的链接中得到了答案: How to apply ObjectCreationHandling.Replace to selected properties when deserializing 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;
    }
}