Benutzerdefinierte Mapping von JSON zu Java / POJO im Frühjahr RestTemplate Antwort

stimmen
0

Ich habe einen Frühling Boot-Anwendung, wo ich RestTemplate bin mit der einen Rest API aufrufen und ich erhalte folgende JSON formatierte Antwort:

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

Die einzelnen Elemente innerhalb des Arrays ‚data‘ hat wenige unterschiedliche Strukturen (2 Beispiele oben), wo Ich mag würde verschiedene Klassentypen mit einzelnen Elementen zuzuordnen, die auf dem Wert des Elements abhängt ‚Typ‘.

Zum Beispiel Wert ‚Typ1‘ sollte auf ein Objekt der Klasse Typs ‚Typ1‘ Karte und so weiter.

Ich habe Klassen wie unten erstellt: MyResponse:

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

Daten:

public Interface Data {}

Typ 1:

public Class Type1 implements Data {
  private String property1;

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

Typ 2:

public Class Type1 implements Data {
  private String property3;

  private String property4;

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

Wie kann ich über bedingte Struktur abzubilden?

Veröffentlicht am 09/10/2019 um 18:55
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
1

Nur so kann ich daran denken könnte, ist der Rückgabewert ein String erhalten, wandeln es in JSONObject und verarbeiten Ihre Instanzen der Klassen zu erstellen. Zum Beispiel,

    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
    }

Dies ist jedoch nicht skalierbar und wenn Sie mehr und mehr Arten werden hinzufügen, es wäre sehr schwierig, einen sauberen Code zu erhalten.

Eine andere Möglichkeit, dies zu tun ist eine allgemeine Klasse zu erstellen und die Antwort als Liste dieser Klasse erhalten. Auf diese Weise Frühlings-boot / jackson cand die Zuordnung tun. Auch hier haben Sie Code hinzufügen, um die anderen Klassen von dieser allgemeinen Klasse zu erstellen. Als Sam im Kommentar darauf hingewiesen, wäre dies ein bevorzugter seit Jackson seine schneller als JSONObject.

Anstelle einer solchen chaotischen Code zu schreiben, würde ich prüfen, ob ich könnte Ihr Design / Antwort gesendet erneut Architekt, wenn Sie die Kontrolle über sie haben.

Beantwortet am 09/10/2019 um 20:06
quelle vom benutzer

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