Beim Json Deserialization sollte man separat Entity Klasse erstellen werden, um Waehrungseintrag(buying, selling..) und Metadaten(update_date) korrekt zu behnadeln.

Wenn wir in eine Json Datei deserialization machen möchten, achten wir darauf, die Felden die Währungsdaten wie buying, selling und Metadaten wie Update_Date getrennt eine jede einzelne Klasse zu werden.

Vorgehensweise:

1- Erstelle eine separate Klasse für Update_Date und Währungsdaten.
2- Passe deserialisierte Struktur an, um diese beide Elemente zu trennen.

Schritt 1: Erstelle eine Wrapper Klasse:

Du musst eine Wrapper-Klasse erstellen, die sowohl das Feld Update_Date als auch die Waehrungsdaten enthält.

public class CurrencyResponse{
   @JsonProperty("Update_Date")
   private String updateDate;
   
   //Map für die Währungsdaten
   Map<String, CurrencyEntity> currencies

   @JsonAnySetter
    public void setCurrencies(String key, RestTemplateEntity value) {
        // Alle anderen Keys sind Währungen, daher speichern wir sie in der Map
        if (!"Update_Date".equals(key)) {
            if (currencies == null) {
                currencies = new HashMap<>();
            }
            currencies.put(key, value);
        }
    }

    public String getUpdateDate() {
        return updateDate;
    }

    public void setUpdateDate(String updateDate) {
        this.updateDate = updateDate;
    }

    public Map<String, RestTemplateEntity> getCurrencies() {
        return currencies;
    }

    public void setCurrencies(Map<String, RestTemplateEntity> currencies) {
        this.currencies = currencies;
    }
}

Schritt 2: Passe den CurrencyService an:

Stelle sicher, dass die JSON-Daten jetzt in die CurrencyResponse-Klasse deserialisiert werden, die Update_Date und Währungen enthält.

@Service
public class RestTemplateService {

    private static final String webUrl = "https://xxx.com/x.json";

    @Autowired
    RestTemplate restTemplate;

    public CurrencyResponse getCurrencies() {
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.set("User-Agent", "Mozilla/5.0");

        HttpEntity<String> httpEntity = new HttpEntity<>(httpHeaders);
        ResponseEntity<CurrencyResponse> response = restTemplate.exchange(
            webUrl, HttpMethod.GET, httpEntity, CurrencyResponse.class
        );

        // Rückgabe der deserialisierten Daten
        return response.getBody();
    }
}

Schritt 3: Passe den CurrencyController an:

Der Controller sollte jetzt die Daten von CurrencyService empfangen und weitergeben.

@RestController
@RequestMapping("/currencies")
public class RestTemplateController {

    @Autowired
    RestTemplateService restTemplateService;

    @GetMapping
    public ResponseEntity<CurrencyResponse> getCurrencies() {
        // Erhalte die Daten von der Service-Klasse
        CurrencyResponse currencies = restTemplateService.getCurrencies();

        // Rückgabe der Daten an den Client
        return new ResponseEntity<>(currencies, HttpStatus.OK);
    }
}

Erklärung:

CurrencyResponse: Diese Klasse enthält die Update_Date-Feld und eine Map für die Währungen. Mit @JsonAnySetter wird sichergestellt, dass alle dynamischen Währungseinträge, die im JSON vorkommen, in die Map „currencies“ geschrieben werden und nicht das CurrencyEntity.

CurrencyService: Wir ändern die Methode so, dass die Antwort als CurrencyResponse-Objekt zurückgegeben wird, anstatt als Map.