json - 反序列化动态 JSON 对象
问题描述
我有个问题。我如何反序列化这个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
}]
在这我知道我必须做什么
我希望我能很好地解释一切。
解决方案
对于非静态属性名称,请使用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}
推荐阅读
- c++ - C++:做一个循环重复
- java - 在考勤应用程序中处理日期和时间
- groovy - HCI XmlSlurper Groovy 找不到同一日期的 job_information 记录
- javascript - 如何在不变异的情况下正确更新 redux 数组中的项目?
- android-studio - 无法使用 Android Studio 3.1.4 导入任何代码示例
- python - 表格解析、复制图像、图形等从一个 docx 到新的 docx - Python
- ios - PieChart IOS内部的颜色阴影
- proxy - 将特定 TCP/UDP 数据包从 VLAN 路由到代理服务器
- php - 自定义类在 symfony 中扩展 tcpdf
- css - Webpack4 - 从较少文件导入的 CSS 文件没有被缩小