Как я могу конвертировать JSON в коллекцию Java - PullRequest
1 голос
/ 02 июля 2019

Я пытаюсь использовать следующий результат API в объект Java. Код можно увидеть ниже.

public Map<String, List<CurrencyData>> gsonCurrency(String answer) {

    Gson g = new Gson();
    CurrencyData currencyData = null;

    Map<String, List<CurrencyData>> object;
    try {
        object = g.fromJson(answer,
                new TypeToken<Map<String, List<CurrencyData>>>().getType());

    } catch (Exception e) {
        throw new OutputFromApiException("HistoricalFlight API output is empty ", e.toString());

    }

    return object;
public class CurrencyData {

    @SerializedName("rates")
    @Expose
    private Rates rates;

    @SerializedName("base")
    @Expose
    private String base;

    @SerializedName("date")
    @Expose
    private String date;

    // Getters & Setters
}

Я получаю следующую ошибку.

Ожидается BEGIN_ARRAY, но это BEGIN_OBJECT в строке 1, столбец 11, путь $.

Ответы [ 2 ]

2 голосов
/ 02 июля 2019

Ваш CurrencyData не является представителем полезной нагрузки от конечной точки API, которую вы вызываете. Самое быстрое решение состоит в том, чтобы изменить Rates rate на карту String валютных ключей на BigDecimal. Не используйте Double, так как вы получите ошибки точности.

    public static class CurrencyData {
        @SerializedName("rates")
        @Expose
        private Map<String, BigDecimal> rates;
        ...
    }

Вы также десериализовали неправильную структуру данных. Вам нужно только десериализовать экземпляр CurrencyData.

    public CurrencyData gsonCurrency(String answer) {
        try {
            return new Gson().fromJson(answer, CurrencyData.class);
        } catch (Exception e) {
            throw new OutputFromApiException("HistoricalFlight API output is empty ", e.toString());
        }
    }

1 голос
/ 02 июля 2019

Вам необходимо изменить свой класс CurrencyData, чтобы он мог выглядеть так, чтобы он мог использовать ваш результат API.

public final class CurrencyData {

    @SerializedName("rates")
    private Map<String, BigDecimal> rates = new HashMap<>();

    @SerializedName("base")
    private String base;

    @SerializedName("date")
    private String date;

    public Map<String, BigDecimal> getRates() {
        return rates;
    }

    public void setRates(Map<String, BigDecimal> rates) {
        this.rates = rates;
    }

    public String getBase() {
        return base;
    }

    public void setBase(String base) {
        this.base = base;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }
}

Теперь вы можете сделать следующий пример.

Gson gson = new Gson();

CurrencyData data = new CurrencyData();
data.setBase("USD");
data.setDate("2019-01-01");

Map<String, BigDecimal> ratesMap = new HashMap<>();
ratesMap.put("SEK", new BigDecimal("9.1"));
ratesMap.put("DKK", new BigDecimal("8.2"));
data.setRates(ratesMap);

String json = gson.toJson(data);

System.out.println(json);

Какие отпечатки:

{"base":"USD","date":"2019-01-01","rates":{"DKK":8.2,"SEK":9.1}}

Вы также можете отменить процесс следующим образом.

CurrencyData parsedData = gson.fromJson(json, CurrencyData.class);
// Prints only the "rates"
System.out.println(parsedData.getRates().toString());

Какие отпечатки:

{DKK=8.2, SEK=9.1}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...