Deserializacja JSON-a z dynamicznymi obiektami

0

Cześć ! Mam pewien problem.

Używam API ze strony www.worldtradingdata.com .
Do pobierania danych z API i deserializacji używam Retrofit-a i GSON-a.

Gdy próbuję pobrać historię kursu danej firmy otrzymuję takiego JSON-a:

{
"symbol": "AAPL",
"stock_exchange_short": "NASDAQ",
"timezone_name": "America/New_York",
"intraday": {
    "2019-03-15 15:30:00": {
        "open": "186.99",
        "close": "186.19",
        "high": "187.08",
        "low": "185.90",
        "volume": "10159747"
    },
    "2019-03-15 14:30:00": {
        "open": "187.04",
        "close": "187.00",
        "high": "187.32",
        "low": "186.89",
        "volume": "2642621"
    },
    "2019-03-15 13:30:00": {
        "open": "186.71",
        "close": "187.03",
        "high": "187.25",
        "low": "186.67",
        "volume": "2995048"
    },
    "2019-03-15 12:30:00": {
        "open": "186.69",
        "close": "186.72",
        "high": "186.81",
        "low": "186.38",
        "volume": "2762442"
    },
    "2019-03-15 11:30:00": {
        "open": "186.21",
        "close": "186.69",
        "high": "186.96",
        "low": "186.10",
        "volume": "3327219"
    },
    "2019-03-15 10:30:00": {
        "open": "185.25",
        "close": "186.22",
        "high": "186.49",
        "low": "184.91",
        "volume": "4503421"
    },
    "2019-03-15 09:30:00": {
        "open": "184.84",
        "close": "185.25",
        "high": "185.34",
        "low": "183.74",
        "volume": "12261774"
    }
}
}

Kiedy dodałem go na stronę www.jsonschema2pojo.org, narzędzie pokazuje mi, abym zrobił osobą klasę dla każdej z dat:

public class Intraday {

@SerializedName("2019-03-15 15:30:00")
@Expose
private com.example._20190315153000 _20190315153000;
@SerializedName("2019-03-15 14:30:00")
@Expose
private com.example._20190315143000 _20190315143000;
@SerializedName("2019-03-15 13:30:00")
@Expose
private com.example._20190315133000 _20190315133000;
@SerializedName("2019-03-15 12:30:00")
@Expose
private com.example._20190315123000 _20190315123000;
@SerializedName("2019-03-15 11:30:00")
@Expose
private com.example._20190315113000 _20190315113000;
@SerializedName("2019-03-15 10:30:00")
@Expose
private com.example._20190315103000 _20190315103000;
@SerializedName("2019-03-15 09:30:00")
@Expose
private com.example._20190315093000 _20190315093000;

Wszytko by było dobrze gdyby nie to, że te daty się zmieniają. Może i ten JSON jest dobry, ale ja nie wiem co zrobić.

W poprzednim API, którego używałem odpowiedź była taka:

[{
		"date": "2017-04-03",
		"open": 143.1192,
		"high": 143.5275,
		"low": 142.4619,
		"close": 143.1092,
		"volume": 19985714,
		"uOpen": 143.1192,
		"uHigh": 143.5275,
		"uLow": 142.4619,
		"uClose": 143.1092,
		"uVolume": 19985714,
		"change": 0.039835,
		"changePercent": 0.028,
		"label": "Apr 03, 17",
		"changeOverTime": -0.0039
	},
	{

		"date": "2017-04-2",
		"open": 143.1192,
		"high": 144.5275,
		"low": 142.4619,
		"close": 143.1092,
		"volume": 19985714,
		"uOpen": 143.1192,
		"uHigh": 143.5275,
		"uLow": 142.4619,
		"uClose": 143.1092,
		"uVolume": 19985714,
		"change": 0.039835,
		"changePercent": 0.028,
		"label": "Apr 03, 17",
		"changeOverTime": -0.0039
	}
]

Przy takiej odpowiedzi wiedziałem jak wydobyć odpowiednie dane, które potrzebowałem.

Dodam jeszcze tylko tyle, że chcę zrobić wykres ( na osi X - daty ; na osi Y - ceny ).

Mógłby mi ktoś wytłumaczyć jak to zrobić ?
Może się to wydawać banalne ale nie wiem co zrobić.

2

Stawiam, że pole "intraday" powinno być mapą z kluczami typu data i wartościami typu klasa z polami "open", "close", itd

0

A mógł byś rozwinąć o co chodzi?

2

Użyj mniej więcej takich klas:

class TradingData {
  final String symbol;
  final String stockExchangeShort;
  final String timezoneName;
  final Map<LocalDateTime, Indicators> intraday;
}

class Indicators {
  final BigDecimal open;
  final BigDecimal close;
  final BigDecimal high;
  final BigDecmial low;
  final BigDecimal volume;
}
0

Dzięki !
Ale mam jeszcze 1 pytanie. Da się z tego zrobić 2 osobne listy ?
Chodzi mi o to żeby w 1 liście były daty, a w 2 tylko ceny, ale żeby pozycja się zgadzała w liście.

Znalazłem coś takiego:

List<String> list = new ArrayList<String>(m.keySet());

List<String> list = new ArrayList<String>(m.values());

Wiesz może czy to by zadziałało ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1