首页 > Java > java教程 > 正文

使用 Gson 解析动态 JSON 键值对到 POJO 对象

心靈之曲
发布: 2025-07-09 17:42:01
原创
655人浏览过

使用 gson 解析动态 json 键值对到 pojo 对象

本文将针对“使用 Gson 解析动态 JSON 键值对到 POJO 对象时遇到的问题”进行详细讲解。关键在于如何处理 JSON 中键名不固定的部分,即动态键。问题的核心在于 Time Series (5min) 字段下的键是日期时间字符串,无法预先定义。通过修改 TimeSeries 类的结构,使用 Map<String, date> 来映射这些动态键值对,可以有效解决解析问题。

1. 问题分析

原始代码中,TimeSeries 类定义如下:

public class TimeSeries {
    @Expose
    private Map<String, date> dates;


    public TimeSeries(Map<String,date> dates){
        super();
        this.dates = dates;
    }
    public Map<String, date> getDates() {
        return dates;
    }
    public void setDates(Map<String,date> dates){
        this.dates = dates;
    }
}
登录后复制

这段代码的问题在于,它试图将Time Series (5min)直接映射到dates字段,但实际上,Time Series (5min)本身就是一个包含动态键值对的 Map。因此,需要调整 DailyQuote 类,将 Time Series (5min) 直接映射到一个 Map<String, date> 类型的字段。

2. 解决方案

修改 DailyQuote 类的 TimeSeries 字段类型,直接使用 Map<String, date>。

public class DailyQuote {

    @SerializedName("Meta Data")
    @Expose
    private MetaData metaData;
    @SerializedName("Time Series (5min)")
    @Expose
    private Map<String, date> timeSeries;

    /**
     * No args constructor for use in serialization
     */
    public DailyQuote() {
    }

    /**
     * @param metaData
     * @param timeSeries
     */
    public DailyQuote(MetaData metaData, Map<String, date> timeSeries) {
        super();
        this.metaData = metaData;
        this.timeSeries = timeSeries;
    }

    public MetaData getMetaData() {
        return metaData;
    }

    public void setMetaData(MetaData metaData) {
        this.metaData = metaData;
    }

    public Map<String, date> getTimeSeries() {
        return timeSeries;
    }

    public void setTimeSeries(Map<String, date> timeSeries) {
        this.timeSeries = timeSeries;
    }
}
登录后复制

同时,移除 TimeSeries 类,因为现在不再需要它。

Text Mark
Text Mark

处理文本内容的AI助手

Text Mark 81
查看详情 Text Mark

3. 代码示例

以下是修改后的 POJO 类结构:

public class DailyQuote {

    @SerializedName("Meta Data")
    @Expose
    private MetaData metaData;
    @SerializedName("Time Series (5min)")
    @Expose
    private Map<String, DateValue> timeSeries;

    // Getters and setters...
}

public class MetaData {

    @SerializedName("1. Information")
    @Expose
    private String _1Information;
    @SerializedName("2. Symbol")
    @Expose
    private String _2Symbol;
    @SerializedName("3. Last Refreshed")
    @Expose
    private String _3LastRefreshed;
    @SerializedName("4. Interval")
    @Expose
    private String _4Interval;
    @SerializedName("5. Output Size")
    @Expose
    private String _5OutputSize;
    @SerializedName("6. Time Zone")
    @Expose
    private String _6TimeZone;

    // Getters and setters...
}

public class DateValue {

    @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;

    // Getters and setters...
}
登录后复制

使用 Gson 解析 JSON 的代码如下:

Gson gson = new Gson();
DailyQuote dailyQuote = gson.fromJson(jsonString, DailyQuote.class);

// 访问数据
MetaData metaData = dailyQuote.getMetaData();
Map<String, DateValue> timeSeries = dailyQuote.getTimeSeries();

// 遍历 Time Series
if (timeSeries != null) {
    for (Map.Entry<String, DateValue> entry : timeSeries.entrySet()) {
        String timestamp = entry.getKey();
        DateValue dateValue = entry.getValue();
        System.out.println("Timestamp: " + timestamp);
        System.out.println("Open: " + dateValue.get_1Open());
        // ... 访问其他数据
    }
}
登录后复制

4. 注意事项

  • Gson 依赖: 确保项目中已经添加了 Gson 依赖。
  • 字段命名: @SerializedName 注解必须与 JSON 中的字段名完全一致,包括大小写。
  • 类型匹配: POJO 类的字段类型必须与 JSON 中对应的值类型匹配。例如,如果 JSON 中的值是字符串,POJO 类中的字段也应该是 String 类型。
  • 空值处理: Gson 默认会将 JSON 中的 null 值映射到 POJO 类的字段中。如果需要自定义空值处理逻辑,可以使用 Gson 的 JsonDeserializer 接口。

5. 总结

通过将 Time Series (5min) 直接映射到 Map<String, date>,可以有效地处理 JSON 中动态键的情况。 这种方法避免了创建额外的 POJO 类来包装动态键,简化了代码结构,提高了可读性。 在实际应用中,需要根据具体的 JSON 结构调整 POJO 类的结构,以确保能够正确解析数据。

以上就是使用 Gson 解析动态 JSON 键值对到 POJO 对象的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号