簡體   English   中英

JSonConverter如何使通用反序列化

[英]JSonConverter how to make generic deserialization

我已經能夠做一個自定義的Converter,可以轉換為接口列表。

這是我的自定義轉換器:

public class InvoiceDetailConverter : JsonConverter {
    public override bool CanConvert(Type objectType) {
        //assume we can convert to anything for now
        return true;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
        List<InvoiceDetail> data = serializer.Deserialize<List<InvoiceDetail>>(reader);

        // now loop to make the proper list
        List<IInvoiceDetail> result = new List<IInvoiceDetail>();
        foreach (IInvoiceDetail d in data) {
            result.Add(d);
        }

        return result;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
        //use the default serialization - it works fine
        serializer.Serialize(writer, value);
    }
}

我想要的是使這種通用

public class InvoiceDetailConverter <TConcrete, TInterface> : JsonConverter {
    public override bool CanConvert(Type objectType) {
        //assume we can convert to anything for now
        return true;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
        List<TConcrete> data = serializer.Deserialize<List<TConcrete>>(reader);

        // now loop to make the proper list
        List<TInterface> result = new List<TInterface>();
        foreach (TInterface d in data) {
            result.Add(d);
        }
        return result;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
        //use the default serialization - it works fine
        serializer.Serialize(writer, value);
    }
}

在我對象的末尾,它將像這樣使用:

public class test{
    [JsonConverter(typeof(InvoiceDetailConverter<InvoiceDetail, IInvoiceDetail>))]
    public List<IInvoiceDetail> InvoiceDetail { get; set; }
}

是否可以這樣轉換,因為上面的代碼不會編譯。 我正在使用.NET Core。

我相信您TConcrete ,只要指定TConcreteTInterface之間的依賴關系TInterface

public class InvoiceDetailConverter<TConcrete, TInterface> : JsonConverter
    where TConcrete : TInterface    // <------------------------------------------ add this
{
    // ..........
}

在這里,您可以使用通用轉換器類針對以下對象找到成功反序列化的演示:

public class test
{
    [JsonConverter(typeof(InvoiceDetailConverter<InvoiceDetail, IInvoiceDetail>))]
    public List<IInvoiceDetail> InvoiceDetail { get; set; }

    [JsonConverter(typeof(InvoiceDetailConverter<VatDetail, IVatDetail>))]
    public List<IVatDetail> VatDetail { get; set; }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM