Issue
I am using Java Spring Boot. What approach should I take to map my JSON response to my class?
I'm looking to write a method that will go over the JSON and create ShareDataDaily objects from the entries that are under "Time Series (Daily)". The date is a key of the object and the price that I want to use is the "4. open".
I plan to make a list of these objects that will be saved into my database.
Any help appreciated.
JSON
{
"Meta Data":{
"1. Information":"Daily Prices (open, high, low, close) and Volumes",
"2. Symbol":"MSFT",
"3. Last Refreshed":"2022-08-01",
"4. Output Size":"Compact",
"5. Time Zone":"US/Eastern"
},
"Time Series (Daily)":{
"2022-08-01":{
"1. open":"277.8200",
"2. high":"281.2800",
"3. low":"275.8400",
"4. close":"278.0100",
"5. volume":"21539580"
},
"2022-07-29":{
"1. open":"277.7000",
"2. high":"282.0000",
"3. low":"276.6300",
"4. close":"280.7400",
"5. volume":"32152752"
},
"2022-07-28":{
"1. open":"269.7500",
"2. high":"277.8400",
"3. low":"267.8700",
"4. close":"276.4100",
"5. volume":"33459327"
},
"2022-07-27":{
"1. open":"261.1600",
"2. high":"270.0500",
"3. low":"258.8500",
"4. close":"268.7400",
"5. volume":"45994049"
}
}
}
Class
package com.example.demo.shareDataDaily;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
@Entity
@Table
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class ShareDataDaily {
@Id
@SequenceGenerator(
name = "sharedatadaily_sequence",
sequenceName = "sharedatadaily_sequence",
allocationSize = 1
)
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "sharedatadaily_sequence"
)
private Long id;
@Column(nullable = false)
private String symbol;
@Column(nullable = false)
private String date;
@Column
private Double openPrice;
public ShareDataDaily(String symbol, String date, Double openPrice) {
this.symbol = symbol;
this.date = date;
this.openPrice = openPrice;
}
}
Method to get the JSON from external API
public List<ShareDataDaily> getShareDataDaily(String symbol) throws JSONException {
WebClientToGetShareItemProperties properties = new WebClientToGetShareItemProperties();
properties.setBaseUrl(WebClientUrlEnum.BASE_URL.getUrl());
properties.setEndPoint(WebClientUrlEnum.DAILY_DATA.getUrl());
WebClientToGetAPI webClientToGetAPI = new WebClientToGetAPI(WebClient.create(), properties);
String dailyDataObj = webClientToGetAPI.getShareInfoFromApiBySymbol(symbol);
JSONObject dailyDataJsonObj = new JSONObject(dailyDataObj);
return listOfData;
}
As you can see I have gotten to the stage where I have the JSON available to be worked with but I cannot figure out what approach to take here to be able to map each of the "Time Series (Daily)" nested objects into a ShareDataDaily class objects so that it can be saved into the DB.
Solution
here is what you could do using Java Stream API:
final JSONObject dailyDataJsonObj = new JSONObject(dailyDataObj);
final String symbol = dailyDataJsonObj.getJSONObject("Meta Data").getString("2. Symbol");
final JSONObject timeSeriesDailyJsonObj = dailyDataJsonObj.getJSONObject("Time Series (Daily)");
final List<ShareDataDaily> listOfData = timeSeriesDailyJsonObj.keySet().stream()
.map(date -> new ShareDataDaily(symbol, date, timeSeriesDailyJsonObj.getJSONObject(date).getDouble("1. open")))
.collect(Collectors.toList());
Answered By - Yevgeniy
Answer Checked By - Willingham (JavaFixing Volunteer)