Задать вопрос
@Quttar

Как десериализовать объект с учетом значения свойства?

Есть библиотека newton.json и строка которую следует десериализовать {"type": "...", data: "..."}
Возможно уже понятно, что я хочу сделать) Мне нужно в зависимости от значения type, которое является строкой, десериализовать значение data к тому или иному классу.

Дело в том, что нужно реализовать именно на этой библиотеке. Я могу вытащить отдельно свойство type при помощи
JObject.parse("...").getValue("type").value<string>()
, но не могу таким же способом на основании полученного значения преобразовать значение поля data, то есть вот так:
JObject.parse("...").getValue("data").value<DataClass>()
.

То есть видимо, данный метод не позволяет преобразовывать к сложным типам, а только простым. Наверняка эта задача уже решалась ранее другими программистами и надеюсь в том числе использованием этой библиотеки, мне достаточно было бы ссылки на метод или вопрос где уже нашли решение. Я пытался найти сам, но не удалось.
  • Вопрос задан
  • 68 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
AshBlade
@AshBlade Куратор тега C#
Просто хочу быть счастливым
На SO уже есть похожий вопрос.

В кратце, после десериализация Json объекта (словаря) смотришь на значение свойства и на его основании, обновляешь нужные поля.

Код оттуда
class MyItemConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return typeof(ItemToSell).IsAssignableFrom(objectType);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject obj = JObject.Load(reader);
        string discriminator = (string)obj["ObjectType"];

        ItemToSell item;
        switch (discriminator)
        {
            case "apple":
                item = new Apple();
                break;
            case "books":
                item = new Books();
                break;
            case "melon":
                item = new Melon();
                break;
            default:
                throw new NotImplementedException();
        }

        serializer.Populate(obj.CreateReader(), item);

        return item;

    }


    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {

    }
}
Ответ написан
@Quttar Автор вопроса
Я все же смог найти решение, нужно использовать метод
JObject.Parse("...").GetValue("...").ToObject<DataClass>()
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы