【发布时间】: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