0

0

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

花韻仙語

花韻仙語

发布时间:2025-07-09 16:06:24

|

758人浏览过

|

来源于php中文网

原创

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

本文将针对 "使用Gson解析动态键值的JSON数据到POJO对象" 这一问题,提供详细的解决方案。在许多API接口中,返回的JSON数据结构可能包含动态的键名,例如日期、时间戳等。这种情况下,传统的POJO映射方式可能会失效。本文将介绍如何使用Gson库,结合Map数据结构,灵活地处理这类动态键值,并将JSON数据成功地映射到POJO对象中,以便后续的数据处理和使用。

在你的示例中,问题在于 Time Series (5min) 节点下的键是动态的日期时间字符串。为了正确解析这种结构,需要对 TimeSeries 类进行调整。

调整 TimeSeries 类

与其创建一个名为 date 的类,不如直接使用 Map 来表示时间序列数据。这里的 Date 类对应于 JSON 中每个日期时间键对应的值。修改后的 TimeSeries 类如下:

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

import java.util.Map;

public class TimeSeries {
    @SerializedName("Time Series (5min)")
    @Expose
    private Map timeSeries;

    public Map getTimeSeries() {
        return timeSeries;
    }

    public void setTimeSeries(Map timeSeries) {
        this.timeSeries = timeSeries;
    }
}

注意,这里我们将 date 类更名为 StockData,以更清晰地表达其含义。StockData 类用于存储每个时间点的股票数据:

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class StockData {

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

    // 构造函数、getter 和 setter 方法
    public StockData() {}

    public StockData(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;
    }

    public String get1Open() {
        return _1Open;
    }

    public void set1Open(String _1Open) {
        this._1Open = _1Open;
    }

    public String get2High() {
        return _2High;
    }

    public void set2High(String _2High) {
        this._2High = _2High;
    }

    public String get3Low() {
        return _3Low;
    }

    public void set3Low(String _3Low) {
        this._3Low = _3Low;
    }

    public String get4Close() {
        return _4Close;
    }

    public void set4Close(String _4Close) {
        this._4Close = _4Close;
    }

    public String get5Volume() {
        return _5Volume;
    }

    public void set5Volume(String _5Volume) {
        this._5Volume = _5Volume;
    }
}

完整 DailyQuote 类

为了完整性,这里提供修改后的 DailyQuote 类:

Ideogram
Ideogram

Ideogram是一个全新的文本转图像AI绘画生成平台,擅长于生成带有文本的图像,如LOGO上的字母、数字等。

下载
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class DailyQuote {

    @SerializedName("Meta Data")
    @Expose
    private MetaData metaData;
    @SerializedName("Time Series (5min)")
    @Expose
    private TimeSeries timeSeries;

    public DailyQuote() {}

    public DailyQuote(MetaData metaData, TimeSeries timeSeries) {
        this.metaData = metaData;
        this.timeSeries = timeSeries;
    }

    public MetaData getMetaData() {
        return metaData;
    }

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

    public TimeSeries getTimeSeries() {
        return timeSeries;
    }

    public void setTimeSeries(TimeSeries timeSeries) {
        this.timeSeries = timeSeries;
    }
}

使用 Gson 解析

现在,可以使用 Gson 将 JSON 数据解析到 POJO 对象中:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class GsonParser {

    public static void main(String[] args) {
        String json = "{\n" +
                "    \"Meta Data\": {\n" +
                "        \"1. Information\": \"Intraday (5min) open, high, low, close prices and volume\",\n" +
                "        \"2. Symbol\": \"IBM\",\n" +
                "        \"3. Last Refreshed\": \"2022-10-26 19:40:00\",\n" +
                "        \"4. Interval\": \"5min\",\n" +
                "        \"5. Output Size\": \"Compact\",\n" +
                "        \"6. Time Zone\": \"US/Eastern\"\n" +
                "    },\n" +
                "    \"Time Series (5min)\": {\n" +
                "        \"2022-10-26 19:40:00\": {\n" +
                "            \"1. open\": \"135.0600\",\n" +
                "            \"2. high\": \"135.0700\",\n" +
                "            \"3. low\": \"135.0400\",\n" +
                "            \"4. close\": \"135.0700\",\n" +
                "            \"5. volume\": \"500\"\n" +
                "        },\n" +
                "        \"2022-10-26 19:05:00\": {\n" +
                "            \"1. open\": \"135.3500\",\n" +
                "            \"2. high\": \"135.3500\",\n" +
                "            \"3. low\": \"135.3500\",\n" +
                "            \"4. close\": \"135.3500\",\n" +
                "            \"5. volume\": \"106\"\n" +
                "        },\n" +
                "        \"2022-10-26 18:50:00\": {\n" +
                "            \"1. open\": \"135.0300\",\n" +
                "            \"2. high\": \"135.0300\",\n" +
                "            \"3. low\": \"135.0300\",\n" +
                "            \"4. close\": \"135.0300\",\n" +
                "            \"5. volume\": \"100\"\n" +
                "        },\n" +
                "        \"2022-10-26 17:50:00\": {\n" +
                "            \"1. open\": \"135.0300\",\n" +
                "            \"2. high\": \"135.0300\",\n" +
                "            \"3. low\": \"135.0300\",\n" +
                "            \"4. close\": \"135.0300\",\n" +
                "            \"5. volume\": \"200\"\n" +
                "        }\n" +
                "    }\n" +
                "}";

        Gson gson = new GsonBuilder().create();
        DailyQuote dailyQuote = gson.fromJson(json, DailyQuote.class);

        // 打印结果进行验证
        System.out.println("Meta Data: " + dailyQuote.getMetaData().get2Symbol());
        System.out.println("Time Series: " + dailyQuote.getTimeSeries().getTimeSeries().keySet());
    }
}

这段代码首先创建了一个 Gson 对象,然后使用 fromJson() 方法将 JSON 字符串解析为 DailyQuote 对象。最后,打印出 Meta Data 中的 Symbol 和 Time Series 中的键,以验证解析是否成功。

注意事项

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

总结

通过使用 Map 数据结构,可以有效地处理包含动态键值的 JSON 数据。 这种方法灵活且易于实现,适用于各种复杂的 JSON 结构。 在实际开发中,应根据具体的 JSON 数据结构和业务需求,选择最合适的 POJO 映射方案。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

408

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

532

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

299

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

231

2023.09.22

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

80

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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