Java 如何在SpringBoot中用Jackson将JSON对象数组解析为DTO
我目前正在构建一个应用程序,它使用RestTemplate来构造对Alpha Vantage API的API请求。下面是一个示例响应,不包括不必要的元数据:Java 如何在SpringBoot中用Jackson将JSON对象数组解析为DTO,java,arrays,json,spring,jackson,Java,Arrays,Json,Spring,Jackson,我目前正在构建一个应用程序,它使用RestTemplate来构造对Alpha Vantage API的API请求。下面是一个示例响应,不包括不必要的元数据: { "Time Series (Daily)": { "2017-11-10": { "1. open": "83.7900", "2. high": "84.1000", "3. low": "83.2300", "4. close": "83.8700", "5.
{
"Time Series (Daily)": {
"2017-11-10": {
"1. open": "83.7900",
"2. high": "84.1000",
"3. low": "83.2300",
"4. close": "83.8700",
"5. volume": "19340435"
},
"2017-11-09": {
"1. open": "84.1100",
"2. high": "84.2700",
"3. low": "82.9000",
"4. close": "84.0900",
"5. volume": "20924172"
},
"2017-11-08": {
"1. open": "84.1400",
"2. high": "84.6100",
"3. low": "83.8300",
"4. close": "84.5600",
"5. volume": "18034170"
},
"2017-11-07": {
"1. open": "84.7700",
"2. high": "84.9000",
"3. low": "83.9300",
"4. close": "84.2700",
"5. volume": "17152583"
},
"2017-11-06": {
"1. open": "84.2000",
"2. high": "84.7000",
"3. low": "84.0800",
"4. close": "84.4700",
"5. volume": "19039847"
},
"2017-11-03": {
"1. open": "84.0800",
"2. high": "84.5400",
"3. low": "83.4000",
"4. close": "84.1400",
"5. volume": "17569120"
}
}
}
我正在构建我的数据传输对象层,它包括:
顶层:
public class Stock extends Dto{
@JsonProperty("Time Series (Daily)")
private TimeSeries timeSeries;
public TimeSeries getTimeSeries() {
return timeSeries;
}
public void setTimeSeries(TimeSeries timeSeries) {
this.timeSeries = timeSeries;
}
}
中间层:
public class TimeSeries extends Dto{
private List<Day> days;
public List<Day> getDays() {
return days;
}
public void setDays(List<Day> days) {
this.days = days;
}
}
运行应用程序时会发生什么:
当我运行应用程序时,顶层(Stock.java)会填充一个时间序列对象,但下一层(TimeSeries.java)并不像我预期的那样包含一个(Day.java)对象数组,它是空的。我试过:
@JSONProperty("2017-11-10")
private Day day;
这确实起作用,弥补中间层到最后一层的差距,数据也很好……但这不是我所追求的。
我期望发生/希望发生的事情: 我正在尝试获取所有日期的数组(在TimeSeries.java中)我相信这是因为JSON响应没有将它们作为JavaScript对象数组,而是作为实际的键和对,所以我不能只列出它们,而是必须直接深入到最终的对象…这不是我想要的 我已经阅读了有关此主题的帖子 如果有人知道我如何让这中间步骤发挥作用,并将对象实际存储在关键的“时间序列(每日)”中,作为天数,然后访问它们的值,那就太棒了注意:此外,如果您打算否决此投票,请在下面评论您为什么这么做。在过去的5个小时里,我已经对此进行了研究,所以我相信我已经做了尽职调查,以便能够在这里提问,我已经尽可能彻底了……来吧。您的Json中没有Json数组。实际上,json对象有多个字段,所以java数据结构应该用Map而不是List表示。如果您想保持当前的类结构,那么您应该理解,您失去了timeseries的日期部分。我认为你不想要这个
选项1。使用HashMap timeSeries
public class Stock {
@JsonProperty("Time Series (Daily)")
private HashMap<String, Day> timeSeries;
public HashMap<String, Day> getTimeSeries() {
return timeSeries;
}
public void setTimeSeries(HashMap<String, Day> timeSeries) {
this.timeSeries = timeSeries;
}
}
公共类股票{
@JsonProperty(“时间序列(每日)”)
私有HashMap时间序列;
公共HashMap getTimeSeries(){
返回时间序列;
}
公共void setTimeSeries(HashMap timeSeries){
this.timeSeries=timeSeries;
}
}
选项2。更改时间序列代码
public class TimeSeries {
// TreeMap because it preserves sorting order
@JsonIgnore
private Map<String, Day> days = new TreeMap<>();
@JsonAnySetter
public void setDays(String time, Day value){
days.put(time,value);
}
@JsonAnyGetter
public Map<String, Day> getData() {
return days;
}
// add getDays() if you need only values
// and if you need list, can use new ArrayList(days.values())
@JsonIgnore
public Collection<Day> getDays(){
return days.values();
}
}
公共类时间序列{
//树映射,因为它保留排序顺序
@杰索尼奥雷
私有映射天数=新建树映射();
@JSONANYSETER
public void setDays(字符串时间,天值){
天数。投入(时间、价值);
}
@JsonAnyGetter
公共地图getData(){
返程天数;
}
//如果只需要值,请添加getDays()
//如果需要列表,可以使用新的ArrayList(days.values())
@杰索尼奥雷
公共集合getDays(){
返回天数。值();
}
}
public class TimeSeries {
// TreeMap because it preserves sorting order
@JsonIgnore
private Map<String, Day> days = new TreeMap<>();
@JsonAnySetter
public void setDays(String time, Day value){
days.put(time,value);
}
@JsonAnyGetter
public Map<String, Day> getData() {
return days;
}
// add getDays() if you need only values
// and if you need list, can use new ArrayList(days.values())
@JsonIgnore
public Collection<Day> getDays(){
return days.values();
}
}