Asignación personalizada de JSON para Java / POJO en respuesta Primavera RestTemplate

votos
0

Tengo una aplicación de inicio de la primavera donde yo estoy usando RestTemplate para llamar a una API REST y recibo siguiente respuesta con formato JSON:

{
  data: [
    {
      id: 1,
      type: type1,
      config: {
        property1 : value1,
        property2 : value2
      }
    },
    {
      id: 2,
      type: type2,
      config: {
        property3 : value3,
        property4 : value4,
        propArray: [ element1, element2]
      }
    }
  ]
}

Los elementos individuales dentro de array 'datos' tiene pocas estructuras diferentes (2 ejemplos anteriores) donde te gustaría para asignar diferentes tipos de clase con elementos individuales que depende del valor del elemento de 'tipo'.

Para 'tipo1' ejemplo valor debe asignar a un objeto de tipo Class 'Tipo1' y así sucesivamente.

Tengo clases creadas como a continuación: MyResponse:

public Class MyResponse {
  List<Data> data;
..
  \\getter and setters
}

Datos:

public Interface Data {}

Tipo 1:

public Class Type1 implements Data {
  private String property1;

  private String property2;
..
  \\getter and setters
}

Tipo 2:

public Class Type1 implements Data {
  private String property3;

  private String property4;

  private List<String> propArray;
..
  \\getter and setters
}

¿Cómo puedo trazar I anterior estructura condicional?

Publicado el 09/10/2019 a las 18:55
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
1

Única manera que podía pensar es obtener el valor devuelto una cadena, convertirlo a JSONObject y procesarla para crear instancias de sus clases. Por ejemplo,

    String response = restTemplate.<your-uri>
    JSONObject jsonObject = new JSONObject(response);
    if (jsonObject.get(type).equals(type1) {
        Type1 type1 = new Type1();
        // set values
    } else if (jsonObject.get(type).equals(type2) {
        Type2 type2 = new Type2()
        // set values
    }

Sin embargo, esto no es escalable y si se va añadir más y más tipos sería muy difícil mantener un código limpio.

Otra manera de hacer esto es crear una clase general y recibir la respuesta en una lista de esa clase. De esta manera Primavera-boot / Jackson cand hacer el mapeo. Una vez más hay que añadir código para crear las otras clases de esta clase general. Cuando Sam se señaló en el comentario, este sería el preferido ya que es más rápido que Jackson JSONObject.

En lugar de escribir dicho código desordenado, consideraría si podía volver a diseñar su diseño / respuesta enviada si usted tiene control sobre él.

Respondida el 09/10/2019 a las 20:06
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more