簡體   English   中英

如何將JSON轉換為Java集合

[英]How can I convert JSON to Java collection

我正在嘗試將以下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但是第1行第11行路徑$為BEGIN_OBJECT。

您的CurrencyData不代表您正在呼叫的API端點的有效負載。 最快的解決方法是將Rates rate更改為String of 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());
        }
    }

您需要將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}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM