C# JSonConverter如何进行泛型反序列化
我已经能够做一个自定义转换器,转换成一系列接口 这里是我的自定义转换器:C# JSonConverter如何进行泛型反序列化,c#,json,asp.net-core,json.net,deserialization,C#,Json,Asp.net Core,Json.net,Deserialization,我已经能够做一个自定义转换器,转换成一系列接口 这里是我的自定义转换器: public class InvoiceDetailConverter : JsonConverter { public override bool CanConvert(Type objectType) { //assume we can convert to anything for now return true; } public override obje
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类InvoiceDetailConverter:JsonConverter{
公共覆盖布尔CanConvert(类型objectType){
//假设我们现在可以转换成任何东西
返回true;
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序){
列表数据=序列化程序。反序列化(读取器);
//现在循环以生成正确的列表
列表结果=新列表();
foreach(数据中的IInvoiceDetail d){
结果.添加(d);
}
返回结果;
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器){
//使用默认序列化-它可以正常工作
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类InvoiceDetailConverter:JsonConverter{
公共覆盖布尔CanConvert(类型objectType){
//假设我们现在可以转换成任何东西
返回true;
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序){
列表数据=序列化程序。反序列化(读取器);
//现在循环以生成正确的列表
列表结果=新列表();
foreach(数据中的TInterface d){
结果.添加(d);
}
返回结果;
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器){
//使用默认序列化-它可以正常工作
serializer.Serialize(writer,value);
}
}
在“我的对象”的末尾,它的用法如下:
public class test{
[JsonConverter(typeof(InvoiceDetailConverter<InvoiceDetail, IInvoiceDetail>))]
public List<IInvoiceDetail> InvoiceDetail { get; set; }
}
公共类测试{
[JsonConverter(类型(InvoiceDetailConverter))]
公共列表InvoiceDetail{get;set;}
}
是否可以这样转换,因为上面的代码无法编译。我使用的是.NET Core。我相信您已经差不多做到了,只需指定
t混凝土
和TInterface
之间的依赖关系即可:
public class InvoiceDetailConverter<TConcrete, TInterface> : JsonConverter
where TConcrete : TInterface // <------------------------------------------ add this
{
// ..........
}
public类InvoiceDetailConverter:JsonConverter
where tcontcrete:TInterface//为什么不使用Newtonsoft的JSON.NET这样的现有工具?您试图解决的问题是什么,需要自定义代码?您好,这是一个自定义转换器,Newtonsoft的JSON.NET将通过属性使用它。基本上我的主要对象是一个需要反序列化的列表。我试图使它通用,以便我可以使用它的其他名单后,然后你得到什么错误?你想干什么?看看第一个示例,看起来您试图告诉它要将其转换为哪个具体类,但实际上是将其作为接口返回?您是否尝试告诉JSON.NET将其转换为您的具体类型,但将变量作为接口的集合?基本上,这里是我尝试的:这将起作用:List data=serializer.Deserialize(reader);//现在循环生成正确的列表结果=new list();foreach(数据中的IInvoiceDetail d){result.Add(d);}但使用泛型(称为tcontcrete和TInterface)执行此操作将不起作用。我试图实现的是使我的转换器通用化,这样我就可以将它用于任何包含接口列表的列表,而不是具体对象列表。Hank,这是我所缺少的,现在它工作起来很有魅力!干得好。我在工作中被牵扯进了一些事情,没有机会写出来。
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; }
}