[英]how can i convert this string which is json response in java collection?
[英]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.