Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# JSonConverter如何进行泛型反序列化_C#_Json_Asp.net Core_Json.net_Deserialization - Fatal编程技术网

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