Retrofit2+GSON解析动态JSON时TimeSeries字段为null的问题
问题:Retrofit2+GSON解析动态JSON时TimeSeries字段为null
问题背景
使用Retrofit2获取的JSON响应中,MetaData能正常解析,但TimeSeries始终返回null,核心原因是POJO结构与JSON层级不匹配,且存在类规范、构造函数缺失等问题。
目标JSON结构核心片段:
{ "Meta Data": {...}, "Time Series (5min)": { "2022-10-26 19:40:00": {"1. open": "...", ...}, "2022-10-26 19:05:00": {"1. open": "...", ...} } }
核心错误点
- TimeSeries类结构冗余:JSON中
"Time Series (5min)"直接是键为时间字符串、值为行情数据的键值对集合,但原代码用TimeSeries类包裹Map<String, date>,GSON无法识别这种额外嵌套。 - 类名不符合规范:Java类名需首字母大写,原
date.java类名小写可能引发解析异常。 - 无参构造函数缺失:
TimeSeries类仅提供带参构造,GSON无法实例化该类,直接返回null。
解决方案
方案一:简化POJO结构(推荐)
直接在DailyQuote中用Map接收时间序列数据,去掉冗余的TimeSeries类。
1. 修改DailyQuote.java
public class DailyQuote { @SerializedName("Meta Data") @Expose private MetaData metaData; @SerializedName("Time Series (5min)") @Expose private Map<String, DateEntry> timeSeries; // 直接用Map接收动态键值对 public DailyQuote() {} public DailyQuote(MetaData metaData, Map<String, DateEntry> timeSeries) { this.metaData = metaData; this.timeSeries = timeSeries; } public MetaData getMetaData() { return metaData; } public void setMetaData(MetaData metaData) { this.metaData = metaData; } public Map<String, DateEntry> getTimeSeries() { return timeSeries; } public void setTimeSeries(Map<String, DateEntry> timeSeries) { this.timeSeries = timeSeries; } }
2. 重命名并修正行情数据类
将原date.java重命名为DateEntry.java(符合Java类名规范),内容不变:
public class DateEntry { @SerializedName("1. open") @Expose private String _1Open; @SerializedName("2. high") @Expose private String _2High; @SerializedName("3. low") @Expose private String _3Low; @SerializedName("4. close") @Expose private String _4Close; @SerializedName("5. volume") @Expose private String _5Volume; public DateEntry() {} public DateEntry(String _1Open, String _2High, String _3Low, String _4Close, String _5Volume) { this._1Open = _1Open; this._2High = _2High; this._3Low = _3Low; this._4Close = _4Close; this._5Volume = _5Volume; } // 原有的getter/setter、toString方法保留 }
方案二:保留TimeSeries类的修正方案
若需保留TimeSeries类,让它直接继承HashMap,GSON会自动解析动态键值对到该类中:
1. 修改TimeSeries.java
public class TimeSeries extends HashMap<String, DateEntry> { // 空类即可,继承HashMap后自动具备Map的所有特性 }
2. 调整DailyQuote.java中的类型
public class DailyQuote { // ... 其他代码不变 @SerializedName("Time Series (5min)") @Expose private TimeSeries timeSeries; // 对应修改构造函数、getter/setter }
验证修改
完成上述调整后,Retrofit的GSON转换器可正确解析"Time Series (5min)"字段,不再返回null。
内容的提问来源于stack exchange,提问作者Nicholas Joshua
相关产品推荐
相关产品推荐

