Всем привет, столкнулся с такой штукой в процессе гугления одной проблемы. Пытался гуглить про враппер, но там какие то не очень наглядные примеры для меня, либо не хватает английского, что бы понять. Допустим у меня есть разные JSON`ы которые я получаю в класс. Из в этих разных JSON`ах всегда примерно одинаковый набор данных которые мне нужно инсертнуть в бд. Мне нужно использовать враппер, что бы эти наборы данных привести к единому виду? Подскажите пожалуйста.
Всем привет, столкнулся с такой штукой в процессе гугления одной проблемы. Пытался гуглить про враппер, но там какие то не очень наглядные примеры для меня, либо не хватает английского, что бы понять. Допустим у меня есть разные 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.
Как потом это дело в базу сохранить это уже другой вопрос.
Не до конца понятен вопрос. Лучше конечно на реальном примере. Но меня наталкивает на мысль что вопрос про [url=https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_class_System_Json.htm]JSON.deserialize[/url]? Обычно создается inner class к примеру [code] public class MySuperClass { public String id; public String name; public Integer total; } [/code] И вот так JSON преобразуется в инстанс твоего класса. Не знаю является MySuperClass враппером который тебя интересует, но вполне возможно. [code] MySuperClass data1 = (MySuperClass)JSON.deserialize(myJsonString1, MySuperClass.class); MySuperClass data2 = (MySuperClass)JSON.deserialize(myJsonString2, MySuperClass.class); [/code] В итоге любой json который содержит объект с полями id, name, total преобразуется в инстранс класса. Все что лишнее проигнорится. Если полей нет, от они в инстансе будет иметь значение null. Как потом это дело в базу сохранить это уже другой вопрос.
Зачем нужен Wrapper?
Для того, чтобы откинуть ЛИШНИЕ данные, которые в каком-то определенном контексте не нужны (например, чтоб уменьшить количество передаваеммых данных, что ведет к увеличению скорости работы приложения).
Пример.
Есть объект Account. Надо вывести 3 поля на страницу в зависимости от других полей, которые или сложно или не возможно отфильтровать в SOQL (или каким-то другим образом попадают в контроллер). Смысл в том, что в конечном итоге в контроллере есть запись Account с 10 полями, а вывести надо всего 3. Так вот, чтоб в UI не отправлять все 10, а только 3, отправляешь не объект типа Account, а объект типа AccountWrapper. И вот у AccountWrapper будет только три поля, а не все 10.
Такая же штука с Custom REST API. Когад отправляешь списки записей и нужны определенные поля.
Зачем нужен 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;
}
Ну я привык в этом случае называть объект как DTO. То есть в этом конкретном случае будет AccountDTO. AccountWrapper же это скорее более общий контейнер который может содержать как сам Account, так и другую дополнительную информацию. То есть вот тако получается: [code] public class AccountDTO { public String id; public String name; public AccountDTO(Account acc) { this.id = acc.Id; this.name = acc.Name; } } [/code] [code] public class AccountWrapper { public Account account; public List<String> adresses; public Map<Date, Object> invoiceByDate; } [/code]
Воу. Ну да. 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');
}
Воу. Ну да. Data Transfer Object. И это вообще паттерн. [quote="seff"]Мне нужно использовать враппер, что бы эти наборы данных привести к единому виду?[/quote] Не обязательно. Если ты сможешь сделать [code] Account a = (Account)JSON.deserializeStrict( incomingJSON, Account.class); [/code] то и никакие Wrapper не нужны. Если так не работает, то только так [code] 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'); } [/code]