如何在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
相关产品推荐
相关产品推荐

