如何将JSON转换为Java集合

如何将JSON转换为Java集合,java,api,collections,spring-data,gson,Java,Api,Collections,Spring Data,Gson,我试图将以下内容转换为Java对象。 代码如下所示 publicmap gsonCurrency(字符串应答){ Gson g=新的Gson(); CurrencyData CurrencyData=null; 地图对象; 试一试{ object=g.fromJson(答案, 新建TypeToken().getType()); }捕获(例外e){ 抛出新的OutputFromApiException(“HistoricalFlight API输出为空”,例如toString()); } 返回对象

我试图将以下内容转换为Java对象。 代码如下所示

publicmap gsonCurrency(字符串应答){
Gson g=新的Gson();
CurrencyData CurrencyData=null;
地图对象;
试一试{
object=g.fromJson(答案,
新建TypeToken().getType());
}捕获(例外e){
抛出新的OutputFromApiException(“HistoricalFlight API输出为空”,例如toString());
}
返回对象;
公共类CurrencyData{
@序列化名称(“费率”)
@暴露
私人差饷;
@序列化名称(“基”)
@暴露
私有字符串基;
@序列化名称(“日期”)
@暴露
私有字符串日期;
//接球手和接球手
}
我得到以下错误


应为BEGIN_数组,但在第1行第11列path$处为BEGIN_对象


您需要修改CurrencyData类,使其看起来像下面这样,以便它能够使用您的API结果

公共最终类CurrencyData{
@序列化名称(“费率”)
私有映射速率=新HashMap();
@序列化名称(“基”)
私有字符串基;
@序列化名称(“日期”)
私有字符串日期;
公共地图{
回报率;
}
公共无效设置率(映射率){
这个。比率=比率;
}
公共字符串getBase(){
返回基地;
}
公共无效收进框(字符串基){
this.base=base;
}
公共字符串getDate(){
返回日期;
}
公共无效设置日期(字符串日期){
this.date=日期;
}
}
现在您可以执行以下示例

Gson-Gson=new-Gson();
CurrencyData=新的CurrencyData();
数据。挫折(“美元”);
数据设置日期(“2019-01-01”);
Map ratesMap=newhashmap();
汇率表卖出价(“瑞典克朗”,新的大十进制(“9.1”);
差饷租值(DKK),新的大十进制(8.2);;
数据。设定费率(费率MAP);
字符串json=gson.toJson(数据);
System.out.println(json);
其中打印:

{"base":"USD","date":"2019-01-01","rates":{"DKK":8.2,"SEK":9.1}}
您也可以像这样反转过程

CurrencyData parsedData=gson.fromJson(json,CurrencyData.class);
//只打印“费率”
System.out.println(parsedData.getRates().toString());
其中打印:

{DKK=8.2, SEK=9.1}

您的
CurrencyData
不能代表您正在调用的API端点的有效负载。最快的修复方法是将
Rates
更改为
String
货币键映射为
BigDecimal
。不要使用
Double
,因为这样会导致精度错误

公共静态类CurrencyData{
@序列化名称(“费率”)
@暴露
私人地图费率;
...
}
您还反序列化了错误的数据结构。您只需要反序列化CurrencyData的实例

公共货币数据gsonCurrency(字符串应答){
试一试{
返回新的Gson().fromJson(应答,CurrencyData.class);
}捕获(例外e){
抛出新的OutputFromApiException(“HistoricalFlight API输出为空”,例如toString());
}
}

很抱歉,您得到的错误是什么?应该是BEGIN\u数组,但在第1行第11列路径处是BEGIN\u对象$