c# - JSonConverter 如何进行泛型反序列化

标签 c# json asp.net-core json.net deserialization

我已经能够做一个转换为接口(interface)列表的自定义转换器。

这是我的自定义转换器:

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。

最佳答案

我相信你已经差不多了,只需指定 TConcreteTInterface 之间的依赖关系:

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

Here您可以找到使用以下对象的通用转换器类成功反序列化的演示:

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; }
}

关于c# - JSonConverter 如何进行泛型反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44589259/

相关文章:

c# - Linq - 在实体或子实体中搜索字符串

c# - WPF PasswordBox 中密码的安全优势不可绑定(bind)?

javascript - 导入 Json 格式的值以使用 Chart.js 创建条形图

android - 正则表达式模式去除一些无效的 JSON 元素

json - 使用 Symfony Forms 在 React 中动态构建表单

asp.net-core - 如何从 Html helper 内部获取 IUrlHelper

c# - 在 Azure 应用服务的 ASP.NET Core 中运行 Phantomjs.exe

c# - WinRT 上的 C++、C# 和 JavaScript

c# - MongoDB - 托管在多台服务器上

mongodb-.net-driver - 带有 MongoDB 的 ASP.NET 5