我有一个使用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之外,我不想创建不同的转换。
答案 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;
}
}