#json #gson
#json #gson
Вопрос:
У меня возник вопрос. Как я могу десериализовать это JSON
?:
{
"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"
}
}
}
Я использую API
из https://www.worldtradingdata.com
Я пытаюсь создать диаграмму в Android App
(ось x — дата и ось y — цена). Как я должен десериализовать этот JSON для получения даты. Дата не является статической.
Я использовал инструмент из http://www.jsonschema2pojo.org
Это показало мне, что я должен создать класс с именем даты, но что будет, когда дата изменится?
В моем предыдущем API я получил такой ответ:
[
{
"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
}]
В этом я знаю, что я должен делать
Я надеюсь, что я все хорошо объяснил.
Ответ №1:
Для имен нестатических свойств используйте Map
. Ваша POJO
модель может выглядеть следующим образом:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.SerializedName;
import java.io.File;
import java.io.FileReader;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Optional;
public class GsonApp {
public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();
FileReader json = new FileReader(jsonFile);
Gson gson = new GsonBuilder().create();
Stock response = gson.fromJson(json, Stock.class);
response.getIntraday().forEach((k, v) -> System.out.println(k " => " v));
}
}
class Stock {
private String symbol;
@SerializedName("stock_exchange_short")
private String stockExchangeShort;
@SerializedName("timezone_name")
private String timeZone;
private Map<String, Data> intraday;
// getters, setters
}
class Data {
private BigDecimal open;
private BigDecimal close;
private BigDecimal high;
private BigDecimal low;
private BigDecimal volume;
// getters, setters
}
Приведенный выше код выводит:
2019-03-15 15:30:00 => Data{open=186.99, close=186.19, high=187.08, low=185.90, volume=10159747}
2019-03-15 14:30:00 => Data{open=187.04, close=187.00, high=187.32, low=186.89, volume=2642621}
2019-03-15 13:30:00 => Data{open=186.71, close=187.03, high=187.25, low=186.67, volume=2995048}
2019-03-15 12:30:00 => Data{open=186.69, close=186.72, high=186.81, low=186.38, volume=2762442}
2019-03-15 11:30:00 => Data{open=186.21, close=186.69, high=186.96, low=186.10, volume=3327219}
2019-03-15 10:30:00 => Data{open=185.25, close=186.22, high=186.49, low=184.91, volume=4503421}
2019-03-15 09:30:00 => Data{open=184.84, close=185.25, high=185.34, low=183.74, volume=12261774}