我想建立一个表格,显示股价在1M,3M,6M等上的变化。过去一天的API调用 返回以下json:
{
"date": "2018-01-02",
"data": {
"AAPL": {
"open": "170.16",
"close": "172.26",
"high": "172.30",
"low": "169.26",
"volume": "25555934"
},
"MSFT": {
"open": "86.13",
"close": "85.95",
"high": "86.31",
"low": "85.50",
"volume": "22483797"
}
}
}
我在Java中建立了一个for循环,该循环使用Calendar遍历了必需的日期,并对这些日期和股票代码列表进行了API调用。我可以使用以下代码反序列化json:
JsonParser jsonParser = new JsonParser();
JsonObject jsonObject = (JsonObject) jsonParser.parse(result);
JsonElement jsonElement = jsonObject.get("data");
Set<Map.Entry<String, JsonElement>> entrySet = jsonElement.getAsJsonObject().entrySet();
entrySet.parallelStream().forEach(entry -> {
Stock stk = new Stock();
stk.setSymbol(entry.getKey());
stk.setClose(entry.getValue().getAsJsonObject().get("close").getAsFloat());
stk.setDate(date.getKey());
问题是使用此代码,我只能将按日期唯一的数据保存在数据库中。我希望保存它,以使它在股票代码中是唯一的。大概我需要将地图对象中的日期收集为POJO的属性。不幸的是,我无法使其工作。任何建议将不胜感激。
答案 0 :(得分:0)
在数据库中创建一个平面表,其中包含日期,符号(例如AAPL)和五个数字的列。因此共有七个专栏。
此策略假设您没有按日期或按库存存储其他数据。 (如果确实每个日期或库存都有其他数据,则需要多个表,日期或库存带有父表。)
就我个人而言,我将用生成的UUID作为主键来拍打另一列。我相信始终使用surrogate key。但严格来讲,如果您的数据库支持多列组合作为natural key,则不必这样做。您可以将日期和符号结合在一起作为主键,以唯一地标识每一行。
CREATE TABLE daily_high_low_ (
date_of_closing_ DATE ,
symbol_ VARCHAR( 4 ) ,
open_ NUMERIC( 12 , 2 ) ,
close_ NUMERIC( 12 , 2 ) ,
high_ NUMERIC( 12 , 2 ) ,
low_ NUMERIC( 12 , 2 ) ,
volume_ INTEGER ,
PRIMARY KEY ( date_of_closing_ , symbol_ )
)
我故意使这个过于简单化。在现实生活中,您将不得不担心股票ticker symbols在stock exchanges中不是唯一的。而且,我已经硬编码了美元和美分金额的数字精度和小数位数,可能并不适合所有市场。而且我们忽略了一个事实,即全球各地的时区都不同。
在处理JSON时,将数据展平以适合此平面表。
要进行检索,请创建一个与该数据库表匹配的类。
public class HighLow {
public LocalDate dateOfClosing ;
public String symbol ;
public BigDecimal open, close, high, low ;
public Integer volume ;
}
从数据库加载到满足数据分析需求的数据结构中。也许每个时间段的硬编码映射:months1,months3,months6等。每个映射将符号映射到HighLow
对象的列表。
要节省内存,您可以在列表中共享相同的对象。例如,months3
映射中的列表与HighLow
映射中的列表具有相同的months1
对象,再加上两个月的HighLow
对象。
Map< String , List< HighLow > > months1 = new TreeMap<>() ;
Map< String , List< HighLow > > months3 = new TreeMap<>() ;
Map< String , List< HighLow > > months6 = new TreeMap<>() ;