Wilkommen auf meinem Blog. Fast der gesamte Inhalt hier besteht aus Notizen, die ich mir selbst gemacht habe. Obwohl es für diese Inhalte keine spezielle Kategorie gibt, finden Sie hier hauptsächlich Rezensionen der Bücher, die ich gelesen habe, meine Softwarenotizen und gelegentlich auch andere Inhalte.
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.