You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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": "...", ...}
    }
}

核心错误点

  1. TimeSeries类结构冗余:JSON中"Time Series (5min)"直接是键为时间字符串、值为行情数据的键值对集合,但原代码用TimeSeries类包裹Map<String, date>,GSON无法识别这种额外嵌套。
  2. 类名不符合规范:Java类名需首字母大写,原date.java类名小写可能引发解析异常。
  3. 无参构造函数缺失: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 18:05:24