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

如何在Java中为复杂JSON对象构建数据模型?(Gson实现)

在Java中使用Gson和HashMap构建复杂JSON数据模型的代码示例

针对你提供的复杂JSON结构,下面给出两种实现方案:自定义POJO类(规范推荐)和HashMap动态解析(灵活适配)。

一、自定义POJO类解析(推荐)

这种方式通过创建与JSON结构一一对应的实体类,实现类型安全的解析,代码可读性和维护性更强。

1. 创建实体类

Competitor.java(参赛队伍)

public class Competitor {
    private String id;
    private String name;
    private String country;
    private String country_code;
    private String abbreviation;
    private String qualifier;
    private String gender;

    // 手动生成Getters和Setters,或使用Lombok的@Data注解简化
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getCountry() { return country; }
    public void setCountry(String country) { this.country = country; }
    public String getCountry_code() { return country_code; }
    public void setCountry_code(String country_code) { this.country_code = country_code; }
    public String getAbbreviation() { return abbreviation; }
    public void setAbbreviation(String abbreviation) { this.abbreviation = abbreviation; }
    public String getQualifier() { return qualifier; }
    public void setQualifier(String qualifier) { this.qualifier = qualifier; }
    public String getGender() { return gender; }
    public void setGender(String gender) { this.gender = gender; }
}

Venue.java(场地信息)

public class Venue {
    private String id;
    private String name;
    private int capacity;
    private String city_name;
    private String country_name;
    private String map_coordinates;
    private String country_code;

    // Getters和Setters
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getCapacity() { return capacity; }
    public void setCapacity(int capacity) { this.capacity = capacity; }
    public String getCity_name() { return city_name; }
    public void setCity_name(String city_name) { this.city_name = city_name; }
    public String getCountry_name() { return country_name; }
    public void setCountry_name(String country_name) { this.country_name = country_name; }
    public String getMap_coordinates() { return map_coordinates; }
    public void setMap_coordinates(String map_coordinates) { this.map_coordinates = map_coordinates; }
    public String getCountry_code() { return country_code; }
    public void setCountry_code(String country_code) { this.country_code = country_code; }
}

Event.java(赛事信息)

import java.util.List;

public class Event {
    private String sport_event_id;
    private String start_date;
    private String sport_name;
    private String competition_name;
    private String competition_id;
    private String season_name;
    private List<Competitor> competitors;
    private Venue venue;
    private double probability_home_team_winner;
    private double probability_draw;
    private double probability_away_team_winner;

    // Getters和Setters
    public String getSport_event_id() { return sport_event_id; }
    public void setSport_event_id(String sport_event_id) { this.sport_event_id = sport_event_id; }
    public String getStart_date() { return start_date; }
    public void setStart_date(String start_date) { this.start_date = start_date; }
    public String getSport_name() { return sport_name; }
    public void setSport_name(String sport_name) { this.sport_name = sport_name; }
    public String getCompetition_name() { return competition_name; }
    public void setCompetition_name(String competition_name) { this.competition_name = competition_name; }
    public String getCompetition_id() { return competition_id; }
    public void setCompetition_id(String competition_id) { this.competition_id = competition_id; }
    public String getSeason_name() { return season_name; }
    public void setSeason_name(String season_name) { this.season_name = season_name; }
    public List<Competitor> getCompetitors() { return competitors; }
    public void setCompetitors(List<Competitor> competitors) { this.competitors = competitors; }
    public Venue getVenue() { return venue; }
    public void setVenue(Venue venue) { this.venue = venue; }
    public double getProbability_home_team_winner() { return probability_home_team_winner; }
    public void setProbability_home_team_winner(double probability_home_team_winner) { this.probability_home_team_winner = probability_home_team_winner; }
    public double getProbability_draw() { return probability_draw; }
    public void setProbability_draw(double probability_draw) { this.probability_draw = probability_draw; }
    public double getProbability_away_team_winner() { return probability_away_team_winner; }
    public void setProbability_away_team_winner(double probability_away_team_winner) { this.probability_away_team_winner = probability_away_team_winner; }
}

EventsResponse.java(外层响应)

import java.util.List;

public class EventsResponse {
    private List<Event> Events;

    public List<Event> getEvents() { return Events; }
    public void setEvents(List<Event> events) { Events = events; }
}

2. 解析代码示例

import com.google.gson.Gson;

public class PojoParserDemo {
    public static void main(String[] args) {
        // 完整JSON字符串
        String json = "{\"Events\":[{\"sport_event_id\": \"sr:sport_event:27636100\",\"start_date\": \"2021-06-22T18:00:00+00:00\",\"sport_name\": \"Soccer\",\"competition_name\": \"UEFA Champions League\",\"competition_id\": \"sr:competition:7\",\"season_name\": \"UEFA Champions League 21/22\",\"competitors\": [{\"id\": \"sr:competitor:37863\",\"name\": \"SS Folgore Falciano Calcio\",\"country\": \"San Marino\",\"country_code\": \"SMR\",\"abbreviation\": \"FFC\",\"qualifier\": \"home\",\"gender\": \"male\"},{\"id\": \"sr:competitor:277829\",\"name\": \"FC Prishtina\",\"country\": \"Kosovo\",\"country_code\": \"KOS\",\"abbreviation\": \"PRI\",\"qualifier\": \"away\",\"gender\": \"male\"}],\"venue\": {\"id\": \"sr:venue:8329\",\"name\": \"Elbasan Arena\",\"capacity\": 12500,\"city_name\": \"Elbasan\",\"country_name\": \"Albania\",\"map_coordinates\": \"41.115875,20.091992\",\"country_code\": \"ALB\"},\"probability_home_team_winner\": 2.5,\"probability_draw\": 88.1,\"probability_away_team_winner\": 9.4}]}";

        Gson gson = new Gson();
        // 解析为实体类对象
        EventsResponse response = gson.fromJson(json, EventsResponse.class);

        // 访问数据示例
        Event firstEvent = response.getEvents().get(0);
        System.out.println("赛事ID:" + firstEvent.getSport_event_id());
        System.out.println("主场队伍:" + firstEvent.getCompetitors().get(0).getName());
        System.out.println("场地名称:" + firstEvent.getVenue().getName());
    }
}

二、使用HashMap动态解析

如果JSON结构不固定,或者不想创建实体类,可以用HashMap嵌套的方式解析,无需提前定义类,但需要手动处理类型转换。

解析代码示例

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.List;
import java.util.Map;

public class HashMapParserDemo {
    public static void main(String[] args) {
        String json = "{\"Events\":[{\"sport_event_id\": \"sr:sport_event:27636100\",\"start_date\": \"2021-06-22T18:00:00+00:00\",\"sport_name\": \"Soccer\",\"competition_name\": \"UEFA Champions League\",\"competition_id\": \"sr:competition:7\",\"season_name\": \"UEFA Champions League 21/22\",\"competitors\": [{\"id\": \"sr:competitor:37863\",\"name\": \"SS Folgore Falciano Calcio\",\"country\": \"San Marino\",\"country_code\": \"SMR\",\"abbreviation\": \"FFC\",\"qualifier\": \"home\",\"gender\": \"male\"},{\"id\": \"sr:competitor:277829\",\"name\": \"FC Prishtina\",\"country\": \"Kosovo\",\"country_code\": \"KOS\",\"abbreviation\": \"PRI\",\"qualifier\": \"away\",\"gender\": \"male\"}],\"venue\": {\"id\": \"sr:venue:8329\",\"name\": \"Elbasan Arena\",\"capacity\": 12500,\"city_name\": \"Elbasan\",\"country_name\": \"Albania\",\"map_coordinates\": \"41.115875,20.091992\",\"country_code\": \"ALB\"},\"probability_home_team_winner\": 2.5,\"probability_draw\": 88.1,\"probability_away_team_winner\": 9.4}]}";

        Gson gson = new Gson();
        // 利用TypeToken指定嵌套泛型类型
        Map<String, List<Map<String, Object>>> eventsMap = gson.fromJson(
                json,
                new TypeToken<Map<String, List<Map<String, Object>>>>() {}.getType()
        );

        // 获取第一个赛事数据
        Map<String, Object> firstEvent = eventsMap.get("Events").get(0);
        System.out.println("赛事ID:" + firstEvent.get("sport_event_id"));

        // 获取参赛队伍列表
        List<Map<String, Object>> competitors = (List<Map<String, Object>>) firstEvent.get("competitors");
        Map<String, Object> homeTeam = competitors.get(0);
        System.out.println("主场队伍名称:" + homeTeam.get("name"));

        // 获取场地信息
        Map<String, Object> venue = (Map<String, Object>) firstEvent.get("venue");
        System.out.println("场地名称:" + venue.get("name"));
    }
}

三、Gson依赖配置

如果使用Maven,在pom.xml中添加以下依赖:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version> <!-- 可替换为最新稳定版本 -->
</dependency>

两种方案对比

  • POJO解析:类型安全,代码可读性高,编译期就能发现类型错误,适合结构固定的JSON场景,推荐优先使用。
  • HashMap解析:无需创建实体类,灵活适配动态结构,但需要手动强制类型转换,运行时可能出现类型转换异常,适合临时快速解析或结构多变的场景。

内容的提问来源于stack exchange,提问作者Toka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 23:20:31