[英]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.