Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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# 使用Newtonsoft JSON反序列化IList对象_C#_.net_Json_Deserialization_Json.net - Fatal编程技术网

C# 使用Newtonsoft JSON反序列化IList对象

C# 使用Newtonsoft JSON反序列化IList对象,c#,.net,json,deserialization,json.net,C#,.net,Json,Deserialization,Json.net,我正在使用ConcreteCollectionTypeConverter来反序列化IList类型的对象。我可能做错了,因为我一直遇到异常“无法将列表转换为IList” 我的对象接口如下所示: [JsonObject(MemberSerialization.OptIn)] public IMyInterface { [JsonProperty("associatedContact")] [JsonConverter(typeof(ConcreteCollectionTypeCon

我正在使用ConcreteCollectionTypeConverter来反序列化IList类型的对象。我可能做错了,因为我一直遇到异常“无法将列表转换为IList”

我的对象接口如下所示:

[JsonObject(MemberSerialization.OptIn)]
public IMyInterface {

    [JsonProperty("associatedContact")]
    [JsonConverter(typeof(ConcreteCollectionTypeConverter<IList<ISomeOtherInterface>, List<SomeOtherInterface>>))]
    IList<ISomeOtherInterface> MyObject { get; set; }
}
public MyImplementation : IMyInterface {

    public List<SomeOtherImplementation> MyObject { get; set; }

    public MyImplementations () {
        MyObject = new List<SomeOtherImplementation>();          
    }
}
class ConcreteCollectionTypeConverter<TInterface, TImplementation> : JsonConverter where TImplementation : TInterface
{
    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return serializer.Deserialize<TImplementation>(reader);
    }
}
var myDeserializedObject = JsonConvert.DeserializeObject<MyImplementation>(jsonObject.ToString());
[JsonObject(MemberSerialization.OptIn)]
公共信息接口{
[JsonProperty(“关联联系人”)]
[JsonConverter(类型of(ConcreteCollectionTypeConverter))]
IList MyObject{get;set;}
}
我的对象实现如下所示:

[JsonObject(MemberSerialization.OptIn)]
public IMyInterface {

    [JsonProperty("associatedContact")]
    [JsonConverter(typeof(ConcreteCollectionTypeConverter<IList<ISomeOtherInterface>, List<SomeOtherInterface>>))]
    IList<ISomeOtherInterface> MyObject { get; set; }
}
public MyImplementation : IMyInterface {

    public List<SomeOtherImplementation> MyObject { get; set; }

    public MyImplementations () {
        MyObject = new List<SomeOtherImplementation>();          
    }
}
class ConcreteCollectionTypeConverter<TInterface, TImplementation> : JsonConverter where TImplementation : TInterface
{
    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return serializer.Deserialize<TImplementation>(reader);
    }
}
var myDeserializedObject = JsonConvert.DeserializeObject<MyImplementation>(jsonObject.ToString());
public MyImplementation:IMyInterface{
公共列表MyObject{get;set;}
公共实现(){
MyObject=新列表();
}
}
我的Json转换器如下所示:

[JsonObject(MemberSerialization.OptIn)]
public IMyInterface {

    [JsonProperty("associatedContact")]
    [JsonConverter(typeof(ConcreteCollectionTypeConverter<IList<ISomeOtherInterface>, List<SomeOtherInterface>>))]
    IList<ISomeOtherInterface> MyObject { get; set; }
}
public MyImplementation : IMyInterface {

    public List<SomeOtherImplementation> MyObject { get; set; }

    public MyImplementations () {
        MyObject = new List<SomeOtherImplementation>();          
    }
}
class ConcreteCollectionTypeConverter<TInterface, TImplementation> : JsonConverter where TImplementation : TInterface
{
    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return serializer.Deserialize<TImplementation>(reader);
    }
}
var myDeserializedObject = JsonConvert.DeserializeObject<MyImplementation>(jsonObject.ToString());
class-ConcreteCollectionTypeConverter:JsonConverter,其中TImplementation:TInterface
{
公共覆盖布尔CanConvert(类型objectType)
{
返回true;
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
serializer.Serialize(writer,value);
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
返回序列化程序。反序列化(读取器);
}
}
我在项目的其他地方调用反序列化方法,如下所示:

[JsonObject(MemberSerialization.OptIn)]
public IMyInterface {

    [JsonProperty("associatedContact")]
    [JsonConverter(typeof(ConcreteCollectionTypeConverter<IList<ISomeOtherInterface>, List<SomeOtherInterface>>))]
    IList<ISomeOtherInterface> MyObject { get; set; }
}
public MyImplementation : IMyInterface {

    public List<SomeOtherImplementation> MyObject { get; set; }

    public MyImplementations () {
        MyObject = new List<SomeOtherImplementation>();          
    }
}
class ConcreteCollectionTypeConverter<TInterface, TImplementation> : JsonConverter where TImplementation : TInterface
{
    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return serializer.Deserialize<TImplementation>(reader);
    }
}
var myDeserializedObject = JsonConvert.DeserializeObject<MyImplementation>(jsonObject.ToString());
var myDeserializedObject=JsonConvert.DeserializeObject(jsonObject.ToString());
上面提到的jsonObject已正确解析

我知道这是可能的,因为我在这里看到了一条评论,所以来自一个用户,他认为他做到了(接受答案的第一条评论)

这种方法适用于非集合项(即使用JsonConverer(typeof(ConcreteTypeCOnverter))反序列化接口类型接口MyObject的对象)


如果我只使用列表而不是ILists,我甚至不需要类型转换器,但我的要求是确保使用ICollections,因为可能存在非标准实现。

我相信这将满足您的需要:

public class ConcreteListTypeConverter<TInterface, TImplementation> : JsonConverter where TImplementation : TInterface 
{
    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var res = serializer.Deserialize<List<TImplementation>>(reader);
        return res.ConvertAll(x => (TInterface) x);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }
}
公共类ConcreteListTypeConverter:JsonConverter,其中TImplementation:TInterface
{
公共覆盖布尔CanConvert(类型objectType)
{
返回true;
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
var res=序列化程序。反序列化(读取器);
返回res.ConvertAll(x=>(TInterface)x);
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
serializer.Serialize(writer,value);
}
}