簡體   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