繁体   English   中英

Json.Net 指定通用类属性的自定义转换器

[英]Json.Net specify custom converter of a property of a generic class

要指定在处理属性时 Json.Net 序列化程序应该使用哪个转换器,我们通常使用JsonConverterAttribute ,这是一种很好且简洁的语法。
但是,由于C#不支持在Attribute中使用泛型类型参数,当属性的声明类包含泛型类型参数时就会出现问题。 这是一个简单的例子:

public class FooConverter<T> : JsonConverter<T> {
    public override void WriteJson(JsonWriter writer, T value, JsonSerializer serializer) {
        //Implementation
    }

    public override T ReadJson(JsonReader reader, Type objectType, T existingValue, bool hasExistingValue, JsonSerializer serializer) {
        //Implementation
    }
}

public class Bar<T>{
    [JsonConverter(typeof(FooConverter<T>))] //CS0416 'T': an attribute argument cannot use type parameters
    public T Value { get; set; }
}

我知道我可以实例化一个通用的转换器和调用时JsonSerializerSettings通过它JsonConvert.DeserializeObject ,但是这需要调用者知道的类型,例如实现细节被反序列化。 我正在写的是一个库,我不想打扰我的用户每次需要反序列化这种类型的对象时手动添加转换器。
当我的自定义转换器确实依赖类型参数时,是否有任何解决方法?

您需要使用非通用转换器,例如

public class FooConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        // ...
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // ...
    }

    public override bool CanRead
    {
        get { return true; } // or false if you don't need custom read
    }

    public override bool CanConvert(Type objectType)
    {
        // ...
    }
}

然后你可以使用[FooConverter]作为属性。 它不会是类型安全的,但由于泛型的非绑定性质,没有其他方法可以做到这一点。 但是,只要在ReadJson方法中返回一个objectType类型的对象,就不会有任何问题。

更多信息在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM