【问题标题】:JSonConverter how to make generic deserializationJSonConverter 如何进行泛型反序列化
【发布时间】:2017-06-16 12:27:28
【问题描述】:

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

这是我的自定义转换器:

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。

【问题讨论】:

  • 为什么不使用像 Newtonsoft 的 JSON.NET 这样的现有工具?您试图解决哪些需要您编写自定义代码的问题?
  • 您好,这是 Newtonsoft 的 JSON.NET 将通过属性使用的自定义转换器。基本上我的主要对象是需要反序列化的 List 。我试图使其通用,以便以后可以将其用于其他列表
  • 那么你得到了什么错误?你想做什么?查看您的第一个示例,您似乎试图告诉它要将其转换为哪个具体类,但实际上将其作为接口返回?您是否尝试告诉 JSON.NET 将其转换为您的具体类型,但将您的变量作为接口的集合?
  • 基本上我在尝试什么:这将起作用: List data = serializer.Deserialize>(reader); // 现在循环生成正确的列表 List result = new List(); foreach (IInvoiceDetail d in data) { result.Add(d);但是用泛型(称为 TConcrete 和 TInterface)来做是行不通的。我试图实现的是使我的转换器通用,这样我就可以将它用于任何包含接口列表而不是具体 Obj 列表的列表

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


【解决方案1】:

我相信你快到了,只需指定 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; }
}

【讨论】:

  • 谢谢,这是我所缺少的,现在它就像一个魅力!
  • 干得好。我在工作中卷入了一些事情,没有机会写下来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 2013-12-19
  • 1970-01-01
相关资源
最近更新 更多