繁体   English   中英

如何在SpringBoot中将Jackson与JSON对象阵列解析为DTO

[英]How To Parse JSON Object Array with Jackson Into DTO In SpringBoot

我目前正在构建一个使用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;
    }
}

最终层(数据平移):

@JsonIgnoreProperties(ignoreUnknown = true)
public class Day extends Dto{

    @JsonProperty("1. open")
    private double open;

    @JsonProperty("2. high")
    private double high;

    @JsonProperty("3. low")
    private double low;

    @JsonProperty("4. close")
    private double close;

    @JsonProperty("5. volume")
    private double volume;

    public double getOpen() {
        return open;
    }

    public void setOpen(double open) {
        this.open = open;
    }

    public double getHigh() {
        return high;
    }

    public void setHigh(double high) {
        this.high = high;
    }

    public double getLow() {
        return low;
    }

    public void setLow(double low) {
        this.low = low;
    }

    public double getClose() {
        return close;
    }

    public void setClose(double close) {
        this.close = close;
    }

    public double getVolume() {
        return volume;
    }

    public void setVolume(double volume) {
        this.volume = volume;
    }
}

当我运行我的应用程序时会发生什么:当我运行应用程序时,顶层(Stock.java)会填充时间序列对象,但是下一层(TimeSeries.java)不包含(Day.java)对象的数组正如我所料,它是空的。 我努力了:

@JSONProperty("2017-11-10") 
private Day day;

这确实有效,并弥补了中间层到最后一层的差距,数据很好......但这不是我追求的。

我期望发生/想要发生的事情:我想在日期列表中获取所有日期的数组(在TimeSeries.java中),但它不起作用,我相信这是因为JSON响应没有将它们作为一个JavaScript对象数组给出,而不是作为一个实际的键和对,所以我不能只列出它们,但必须直接深入到最终对象......这不是我想要的。

关于这个话题我读过的主题

使用resttemplate解析JSON数组

用杰克逊解析JSON

用Jackson Java解析JSON

无法使用Spring RestTemplate使用JSON数组

如何使用Spring RestTemplate表示为JSON的查询参数?

如何使用Jackson或任何其他api反序列化对象数组?

使用Jackson注释对子数组进行JSON解析?

杰克逊映射字符串或简单字符串列表

我应该在哪里获取对象来表示RESTful api中传递的内容(Json)

如果有人知道如何让中间步骤工作并实际将对象存储在关键字“时间序列(每日)”中作为Days,那么访问它们的值非常棒。

注意:此外,如果您要对此进行投票,请在下面评论您为什么这样做。 我在过去的5个小时里对此进行了研究,所以我相信我已经做了尽职调查,能够在这里问问我已经尽可能彻底了......来吧。

你的json中没有Json数组。 实际上你有json对象有多个字段,所以你的java数据结构应该用Map表示而不是List。 如果你想保持当前的类结构,那么你应该明白,你丢失了时间序列的日期部分。 我不认为你想要这个。


选项1.使用HashMap<String, Day> 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;
    }
}

选项2.更改TimeSeries代码

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();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM