Как десериализовать интерфейсы с помощью Newtonsoft Json.Net - PullRequest
0 голосов
/ 31 мая 2018

У меня есть эта иерархия классов:

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 Ответ

0 голосов
/ 31 мая 2018

Понятно!

Конвертер, представленный в статье, работает очень хорошо, мне просто не хватало синтаксиса для использования его в свойстве коллекции.Вот код с конвертером и рабочими атрибутами:

// 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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...