Olá pessoal, Estou tentando utilizar o RestTemplate do Spring Boot para fazer um GET em uma api JSON, porém o response é JSON NESTED e o meu modelo não está conseguindo entender o campo nested desse JSON. Segue meu código abaixo.
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown = true)
public class Currency {
private BigDecimal amount;
private String base_currency_code;
private String base_currency_name;
private Rates rates;
private String status;
private Date updated_date;
public BigDecimal getAmount() {
return amount;
}
public void setAmount(BigDecimal amount) {
this.amount = amount;
}
public String getBase_currency_code() {
return base_currency_code;
}
public void setBase_currency_code(String base_currency_code) {
this.base_currency_code = base_currency_code;
}
public String getBase_currency_name() {
return base_currency_name;
}
public void setBase_currency_name(String base_currency_name) {
this.base_currency_name = base_currency_name;
}
public Rates getRates() {
return rates;
}
public void setRates(Rates rates) {
this.rates = rates;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Date getUpdated_date() {
return updated_date;
}
public void setUpdated_date(Date updated_date) {
this.updated_date = updated_date;
}
}
package br.com.marcelomsilva.valorhoje.model;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown = true)
public class Rates {
private BRL BRL;
public BRL getBRL() {
return this.BRL;
}
public void setBRL(BRL brl) {
this.BRL = brl;
}
}
public class BRL {
private String currency_name;
private String rate;
private String rate_for_amount;
public String getCurrency_name() {
return currency_name;
}
public void setCurrency_name(String currency_name) {
this.currency_name = currency_name;
}
public String getRate() {
return rate;
}
public void setRate(String rate) {
this.rate = rate;
}
public String getRate_for_amount() {
return rate_for_amount;
}
public void setRate_for_amount(String rate_for_amount) {
this.rate_for_amount = rate_for_amount;
}
}
@marcelomsilva
boa noite, segue exemplo:
import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@ToString
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class Currency implements Serializable {
private static final long serialVersionUID = -7175171855460113680L;
private BigDecimal amount;
@JsonAlias("base_currency_code")
private String baseCurrencyCode;
private Rates rates;
private String status;
@JsonAlias("updated_date")
@JsonFormat(pattern = "yyyy-MM-dd", shape = JsonFormat.Shape.STRING, timezone = "America/Sao_Paulo")
private Date updatedDate;
}
import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.*;
import java.io.Serializable;
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@ToString
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class Rates implements Serializable {
private static final long serialVersionUID = -1621953727044942951L;
@JsonAlias("BRL")
private Brl brl;
}
import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.*;
import java.io.Serializable;
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@ToString
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class Brl implements Serializable {
private static final long serialVersionUID = -8632762889283113740L;
@JsonAlias("currency_name")
private String currencyName;
private String rate;
@JsonAlias("rate_for_amount")
private String rateForAmount;
}
Eu fiz um teste usando apenas a biblioteca Jackson e deu certinho.
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.text.SimpleDateFormat;
public class JsonParseTest {
public static void main(String[] args) {
new JsonParseTest().start();
}
public void start() {
try {
File file = new File("src/br/com/json_parse/text.json");
ObjectMapper objectMapper = new ObjectMapper();
Currency currency = objectMapper.readValue(file, Currency.class);
System.out.println(currency);
System.out.println(new SimpleDateFormat("dd/MM/yyyy").format(currency.getUpdatedDate()));
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
Resultado:
Currency(amount=1.0000, baseCurrencyCode=USD, rates=Rates(brl=Brl(currencyName=Brazilian Real, rate=5.7885, rateForAmount=5.7885)), status=sucess, updatedDate=Mon May 18 00:00:00 BRT 2020)