Регистрация  |  Вход

Wrapper класс, помогите въехать.

Всем привет, столкнулся с такой штукой в процессе гугления одной проблемы. Пытался гуглить про враппер, но там какие то не очень наглядные примеры для меня, либо не хватает английского, что бы понять. Допустим у меня есть разные 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. И это вообще паттерн.

seff
Мне нужно использовать враппер, что бы эти наборы данных привести к единому виду?

Не обязательно. Если ты сможешь сделать
Account a = (Account)JSON.deserializeStrict(
incomingJSON,
Account.class);

то и никакие Wrapper не нужны. Если так не работает, то только так
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]