ogregor
@ogregor
арендатор vpn сервера debian

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

Здравствуйте, как правильно спарсить json объект в класс.

Данные клиента:

{"contacts":[
    {
        "FirstName": "Vasya",
        "SecondName": "Petrov",
        "Phones": [ "79854571245"]
    }, 
    {
        "FirstName": "Petya",
        "Company": "SDD",
        "Phones": ["79854571241","79854571246"]
}]
}

Принимаю запрос:

public ActionResult Update(List<Contact> contacts)
 {   
   return Json(new { state = contacts });
 }

Структура классов, в которую парсится запрос

public class Contact
    {

        public Contact()
        {
            var Phones = new List<Phone>();
        }
        public int id { get; set; }

        public string FirstName { get; set; }

        public string SecondName { get; set; }

        public string Company { get; set; }

        public string UserId { get; set; }
        [ForeignKey("UserId")]
        public virtual ApplicationUser User { get; set; }

        public ICollection<Phone> Phones { get; set; }

        public DateTime DateAdd { get; set; } = DateTime.Now;
    }
}

Phone

public class Phone
    {

        public int id { get; set; }
        public string Tel { get; set; }

        public int ContactId { get; set; }

        [ForeignKey("ContactId")]
        public virtual Contact Contact { get; set; }

        public DateTime DateAdd { get; set; } = DateTime.Now;
    }
}

Естественно что структура запроса несовсем соответствует классам. Можно ли реализовать кастомный конструктор чтобы и заполнить соответствующие поля коллекции Phones
  • Вопрос задан
  • 171 просмотр
Пригласить эксперта
Ответы на вопрос 2
@heartdevil
плыву как воздушный шарик
Вот тут посмотрите
смотреть
Ответ написан
Комментировать
@kttotto
пофиг на чем писать
В Вашем случае поле Phones будет пытаться десериализовать в ICollection<string>, но т.к. в модели ICollection<Phone>, то наверное будет эксепшн о невозможности преобразование.

Одним из решений является ответ выше, реализовать свой JsonConverter (по образу как по ссылке, под Ваш случай там небольшие изменения) и пометить поле Phonesатрибутом с этим конвертером.

Но я бы так не делал. Для меня есть разница между моделями которые ходят между запросами и моделями с которыми работает логика. Поэтому одна модель для Вашего запроса с полем типа ICollection<string> (у меня эта модель называлась бы ContractDTO), и потом я бы уже ее мапил в Contract, в котором поле Ponesбудет типа ICollection<Phone>. Делать это можно либо библиотекой automaper, либо руками, через modelDTO.Select(x => new Model { ... });
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Монополия Санкт-Петербург
от 87 000 до 87 000 ₽
Enqo Москва
от 200 000 ₽
04 мая 2024, в 03:57
10000 руб./за проект
04 мая 2024, в 01:47
2000 руб./за проект