反序列化json对象以进行时间序列分析

时间:2019-03-17 18:23:12

标签: json

我想建立一个表格,显示股价在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的属性。不幸的是,我无法使其工作。任何建议将不胜感激。

1 个答案:

答案 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 symbolsstock 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<>() ;