【问题标题】:Deserializing IList objects with Newtonsoft JSON使用 Newtonsoft JSON 反序列化 IList 对象
【发布时间】:2013-03-14 16:12:28
【问题描述】:

我正在使用 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>();          
    }
}

我的 Json 转换器如下所示:

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被正确解析了。

我知道这是可能的,因为我在这里看到了一个用户对 SO 的评论,称他已经做到了(Casting interfaces for deserialization in JSON.NET - 已接受答案的第一条评论)。

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

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

【问题讨论】:

    标签: c# .net json deserialization json.net


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-26
      • 2018-07-30
      相关资源
      最近更新 更多