Разбор различных JSON в одной модели


У меня есть несколько моделей JSON, которые представляют же логической модели. е.г: {"title":"title1","years":"31"} и {"name":"title1","age":31}

на данный момент я делаю 2 разных классов, которые реализуют тот же интерфейс

 public class NameModel implements Person {

  @SerializedName("name") private String name;
  @SerializedName("age") private int age;

  public String getName() {
    return name;
  }

  public int getAge() {
    return age;
  }
}
public class TitleModel implements Person {

  @SerializedName("title") private String title;
  @SerializedName("years") private int years;

  public String getName() {
    return title;
  }

  public int getAge() {
    return years;
  }
}
public interface Person {
  String getName();
  int getAge();
}

Это правильный подход к унификации разных моделей в одно, если они по сути одинаковые, но с разными именами полей?



127
1
задан 21 февраля 2018 в 12:02 Источник Поделиться
Комментарии
1 ответ

в Джексон, вы имеете миксины характеристика. Это позволяет добавить или переопределить аннотации во время выполнения.

Итак, у нас есть один целевой объект POJO

public class Person
{
private String name;
private int age;

public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}

и миксин-классы могут быть интерфейсы (они не инициализировались) с соответствующими сеттера подписей и разные аннотации

public interface NameModel
{
@JsonProperty("name")
void setName(String name);
@JsonProperty("age")
void setAge(int age);
}

public interface TitleModel
{
@JsonProperty("title")
void setName(String name);
@JsonProperty("years")
void setAge(int age);
}

во время выполнения можно связать одно подмешать к целевых классов. Джексон играм свойств и методов по имени и исполняет аннотации от миксин. переопределяя любые от цели:

public static void main(String[] args) {
String nameModelJson = "{\"name\":\"title1\",\"age\":31}";
try (InputStream is = new ByteArrayInputStream(nameModelJson.getBytes())) {
ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(Person.class, NameModel.class);
Person p = mapper.readValue(is, Person.class);
System.out.println(p.name + " " + p.age);
} catch (Exception e) {
e.printStackTrace();
}

String titleModelJson = "{\"title\":\"title1\",\"years\":\"31\"}";
try (InputStream is = new ByteArrayInputStream(titleModelJson.getBytes())) {
ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(Person.class, TitleModel.class);
Person p = mapper.readValue(is, Person.class);
System.out.println(p.name + " " + p.age);
} catch (Exception e) {
e.printStackTrace();
}
}

1
ответ дан 21 февраля 2018 в 01:02 Источник Поделиться