代码之家  ›  专栏  ›  技术社区  ›  Bruno

如何使用newtonsoft json.net反序列化接口

  •  0
  • Bruno  · 技术社区  · 7 年前

    我有这样的等级制度:

    public class ProxyBotsSnapshotLogEntryDetails : IBotsSnapshotLogEntryDetails
    {
        public ICollection<IBotSnapshot> Snapshots { get; set; }
    }
    public class ProxyBotSnapshot : IBotSnapshot
    {
        public string Name { get; set; }
        public ICollection<IBotSnapshotItem> States { get; set; }
    }
    
    public class ProxyBotSnapshotItem : IBotSnapshotItem
    {
        public int Count { get; set; }
        public IrcBotChannelStateEnum State { get; set; }
    }
    

    以及相应的接口

    public interface IBotsSnapshotLogEntryDetails
    {
        ICollection<IBotSnapshot> Snapshots { get; set; }
    }
    
    public interface IBotSnapshot
    {
        string Name { get; set; }
        ICollection<IBotSnapshotItem> States { get; set; }
    }
    
    public interface IBotSnapshotItem
    {
        int Count { get; set; }
        IrcBotChannelStateEnum State { get; set; }
    }
    

    我想从json反序列化:

    var test = JsonConvert.DeserializeObject<ProxyBotsSnapshotLogEntryDetails>(entry.DetailsSerialized);
    

    但是我得到一个错误,说newtonsoft不能转换接口。

    我发现这篇很有前途的文章:

    https://www.c-sharpcorner.com/UploadFile/20c06b/deserializing-interface-properties-with-json-net/

    但不知道如何使用属性,因为在我的例子中,属性是一个接口列表。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Bruno    7 年前

    知道了!

    本文中提供的转换器工作得非常好,我只是缺少在集合属性上使用它的语法。下面是带有转换器和工作属性的代码:

    // From the article
    public class ConcreteConverter<T> : JsonConverter
    {
        public override bool CanConvert(Type objectType) => true;
    
        public override object ReadJson(JsonReader reader,
         Type objectType, object existingValue, JsonSerializer serializer)
        {
            return serializer.Deserialize<T>(reader);
        }
    
        public override void WriteJson(JsonWriter writer,
            object value, JsonSerializer serializer)
        {
            serializer.Serialize(writer, value);
        }
    }
    
    public class ProxyBotsSnapshotLogEntryDetails : IBotsSnapshotLogEntryDetails
    {
        [JsonProperty(ItemConverterType = typeof(ConcreteConverter<ProxyBotSnapshot>))]
        public ICollection<IBotSnapshot> Snapshots { get; set; }
    }
    public class ProxyBotSnapshot : IBotSnapshot
    {
        public string Name { get; set; }
    
        [JsonProperty(ItemConverterType = typeof(ConcreteConverter<ProxyBotSnapshotItem>))]
        public ICollection<IBotSnapshotItem> States { get; set; }
    }
    
    public class ProxyBotSnapshotItem : IBotSnapshotItem
    {
        public int Count { get; set; }
        public IrcBotChannelStateEnum State { get; set; }
    }
    
    推荐文章