Всем привет, столкнулся с такой штукой в процессе гугления одной проблемы. Пытался гуглить про враппер, но там какие то не очень наглядные примеры для меня, либо не хватает английского, что бы понять. Допустим у меня есть разные JSON`ы которые я получаю в класс. Из в этих разных JSON`ах всегда примерно одинаковый набор данных которые мне нужно инсертнуть в бд. Мне нужно использовать враппер, что бы эти наборы данных привести к единому виду? Подскажите пожалуйста.
Не до конца понятен вопрос. Лучше конечно на реальном примере.
Но меня наталкивает на мысль что вопрос про JSON.deserialize?
Обычно создается inner class к примеру
public class MySuperClass {
public String id;
public String name;
public Integer total;
}И вот так JSON преобразуется в инстанс твоего класса. Не знаю является MySuperClass враппером который тебя интересует, но вполне возможно.
MySuperClass data1 = (MySuperClass)JSON.deserialize(myJsonString1, MySuperClass.class);
MySuperClass data2 = (MySuperClass)JSON.deserialize(myJsonString2, MySuperClass.class);
В итоге любой json который содержит объект с полями id, name, total преобразуется в инстранс класса. Все что лишнее проигнорится. Если полей нет, от они в инстансе будет иметь значение null.
Как потом это дело в базу сохранить это уже другой вопрос.
Зачем нужен Wrapper?
Для того, чтобы откинуть ЛИШНИЕ данные, которые в каком-то определенном контексте не нужны (например, чтоб уменьшить количество передаваеммых данных, что ведет к увеличению скорости работы приложения).
Пример.
Есть объект Account. Надо вывести 3 поля на страницу в зависимости от других полей, которые или сложно или не возможно отфильтровать в SOQL (или каким-то другим образом попадают в контроллер). Смысл в том, что в конечном итоге в контроллере есть запись Account с 10 полями, а вывести надо всего 3. Так вот, чтоб в UI не отправлять все 10, а только 3, отправляешь не объект типа Account, а объект типа AccountWrapper. И вот у AccountWrapper будет только три поля, а не все 10.
Такая же штука с Custom REST API. Когад отправляешь списки записей и нужны определенные поля.
Ну я привык в этом случае называть объект как DTO. То есть в этом конкретном случае будет AccountDTO.
AccountWrapper же это скорее более общий контейнер который может содержать как сам Account, так и другую дополнительную информацию.
То есть вот тако получается:
public class AccountDTO {
public String id;
public String name;
public AccountDTO(Account acc) {
this.id = acc.Id;
this.name = acc.Name;
}
}public class AccountWrapper {
public Account account;
public List<String> adresses;
public Map<Date, Object> invoiceByDate;
}Воу. Ну да. Data Transfer Object. И это вообще паттерн.
Не обязательно. Если ты сможешь сделать
Account a = (Account)JSON.deserializeStrict(
incomingJSON,
Account.class);
public class Car {
public String make;
public String year;
}public void parse() {
Car c = (Car)JSON.deserializeStrict(
incomingJSON,
Car.class);
System.assertEquals(c.make, 'SFDC');
System.assertEquals(c.year, '2020');
}