Java 如何在SpringBoot中用Jackson将JSON对象数组解析为DTO

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.

我目前正在构建一个应用程序,它使用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. 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();
    }
}