Как можно сопоставить поля, возвращаемые в JSON, с моей сущностью, если ключ в JSON имеет другое имя, чем поля в моей сущности - PullRequest
0 голосов
/ 29 июня 2019

Я пытаюсь отобразить ответ JSON на Java POJO, имя которого отличается от имени другого API. Мне нужен эффективный способ сделать это, сокращая стандартные коды.

Я попытался отобразить поле свойства JSON в Java POJO. Однако проблема в том, что я получаю данные из разных источников.

Допустим, у меня ниже класс пользователя

    Class User{
       String name;
       String contact;
    }

JSON, который я могу получить из разных источников, может быть

{"name": "ABC" , "contact": "123456"}

or
{"userName": "XYZ" , "mobileNo":"4354665"}

Может быть больше вариаций, поскольку мы продолжаем интегрировать больше API

Есть ли способ архивировать это? Выше приведен простой пример

может быть более сложный объект JSON, который мне может понадобиться прочитать. как список пользователей и т. д.

Ответы [ 2 ]

2 голосов
/ 29 июня 2019

Вы можете использовать @ JsonAlias ​​() , чтобы присвоить переменной более одной привязки ключа JSON.

@ JsonAlias ​​представлен в выпуске Jackson 2.9.@JsonAlias ​​определяет одно или несколько альтернативных имен для свойства, которое будет принято во время десериализации, т. Е. Установка данных JSON для объекта Java.Но во время сериализации, т.е. при получении JSON из Java-объекта, используется только фактическое логическое имя свойства, а не псевдоним.@JsonAlias ​​определяется следующим образом.

@Entity
Class User{

   @JsonProperty()
   @JsonAlias({"name", "userName"})
   String name;

   @JsonProperty()
   @JsonAlias({"contact", "mobileNo"})
   String contact;
}
0 голосов
/ 01 июля 2019

Вы можете использовать аннотацию @JsonSetter, например:

public class User{
    public String contact;
    public String name;

    @JsonSetter("name")
    public void setName(String name) {
      this.name = name;
    }

    @JsonSetter("userName")
    public void setName(String name) {
      this.name = name;
    }
}

Вместо прямого сопоставления с классом сущности, вы должны иметь объект или модель DTO между ними для сопоставления ответа json.Затем вы можете преобразовать это в любую сущность, которую вы можете выбрать. Если вы выбираете данные из разных источников, это означает, что вы вызываете разные конечные точки, почему бы вам не создать разные DTO для этого. Таким образом, даже если одиниз конечных точек вносит изменение, оно не повлияет на остальные вызовы конечной точки.

И наоборот, вы можете получить разные объекты DTO, возвращаемые из двух конечных точек вместо того, чтобы возвращать один и тот же класс Entity,таким образом, вы можете контролировать, какие атрибуты должны присутствовать в ответе.

Чтобы уменьшить код котельной пластины, вы можете использовать библиотеку, такую ​​как MAP STRUCT , чтобы включить преобразование между объектом и DTOобъекты легко

Читайте здесь о преимуществах использования DTO.

...