Использование JSON.NET для десериализации в производный класс

Я боролся с этим в течение нескольких часов, и я не могу найти решение. Используя JSON.NET, я пытаюсь десериализовать некоторые данные в тот или иной производный класс, НО я хочу настроить таргетинг на правильный производный класс на основе поля, которое на самом деле находится в этих данных...

Вот упрощенный пример:

public class BaseFile {
    public string Name{get;set;}
}

public class Directory : BaseFile {
    public int FileSize {get;set;}
}

public class Video : BaseFile {
    public int  Duration{get;set}
}

Я получаю эти данные в формате JSON:

{
  "files": [
    {
      "content_type": "application/x-directory", 
      "size": 566686478
    }, 
    {
      "content_type": "video/x-matroska", 
      "duration": 50
    }
}

Теперь я хочу использовать JSON.NET на основе поля content_type для создания экземпляра объекта Directory (если content_type равно application/x-directory) или объекта Video (если content_type равно video/x-matroska).

Простое решение состоит в том, чтобы десериализовать весь контент в базовый класс, а затем преобразовать его в соответствующие производные классы, но я не нахожу это эффективным, поэтому мне интересно, есть ли другое решение!

Заранее благодарим вас за ваш вклад (ы).


person Invvard    schedule 16.04.2014    source источник


Ответы (1)


Мой друг указал мне на этот пост, который решает мою проблему:

Десериализация гетерогенного массива JSON в ковариантный список‹› с использованием JSON. НЕТТО

Я только что попробовал, и для моего случая адаптированный код написан так:

private BaseFile Create(Type objectType, JObject jObject)
{
    var type = (string)jObject.Property("content_type");
    switch (type)
    {
        case "application/x-directory":
            return new Directory();
        case "video/x-matroska":
            return new Video();
        default:
            return new BaseFile();
    }
}
person Invvard    schedule 21.04.2014