如何用Gson读取含动态属性的JSON?以atletas字段为例
用Gson处理动态键的JSON结构
嘿,这个问题我之前也碰到过!Gson处理这种以动态ID作为键的JSON结构其实有几种很实用的方法,我给你拆解一下:
方法一:用Map<String, 实体类>映射动态字段
这是最省心的方案,Gson会自动把JSON里的动态键值对转换成Map的键和对应的实体对象。
步骤1:定义对应的实体类
首先,先把运动员(Atleta)的结构封装成实体类,里面包含你需要的字段:
public class Atleta { private String apelido; private double pontuacao; private Map<String, Integer> scout; // scout里也是动态键,用Map接收刚好 private String foto; private int posicao_id; private int clube_id; // 别忘了添加getter、setter,或者用Lombok简化代码 }
然后定义外层的根实体类,用Map<String, Atleta>来接收atletas字段:
public class RodadaResponse { private int rodada; private Map<String, Atleta> atletas; // getter、setter省略 }
步骤2:解析JSON
直接用Gson的fromJson方法就能完成解析,之后遍历Map就能拿到所有动态ID和对应的运动员信息:
String json = "你的JSON字符串"; Gson gson = new Gson(); RodadaResponse response = gson.fromJson(json, RodadaResponse.class); // 遍历所有运动员 for (Map.Entry<String, Atleta> entry : response.getAtletas().entrySet()) { String atletaId = entry.getKey(); // 动态的ID,比如"100651" Atleta atleta = entry.getValue(); System.out.println("ID: " + atletaId + ", 昵称: " + atleta.getApelido()); // 还可以读取scout里的内容 for (Map.Entry<String, Integer> scoutEntry : atleta.getScout().entrySet()) { System.out.println("Scout项: " + scoutEntry.getKey() + ", 数值: " + scoutEntry.getValue()); } }
方法二:用JsonObject手动解析(无需实体类)
要是你不想定义实体类,或者只是临时需要读取数据,用Gson的JsonObject手动解析也很灵活:
String json = "你的JSON字符串"; Gson gson = new Gson(); JsonObject root = gson.fromJson(json, JsonObject.class); // 获取rodada字段 int rodada = root.get("rodada").getAsInt(); // 获取atletas对应的JsonObject JsonObject atletasJson = root.getAsJsonObject("atletas"); // 遍历所有动态ID和对应的运动员数据 for (Map.Entry<String, JsonElement> entry : atletasJson.entrySet()) { String atletaId = entry.getKey(); JsonObject atletaJson = entry.getValue().getAsJsonObject(); // 手动提取字段 String apelido = atletaJson.get("apelido").getAsString(); double pontuacao = atletaJson.get("pontuacao").getAsDouble(); JsonObject scoutJson = atletaJson.getAsJsonObject("scout"); System.out.println("ID: " + atletaId + ", 昵称: " + apelido + ", 得分: " + pontuacao); // 遍历scout for (Map.Entry<String, JsonElement> scoutEntry : scoutJson.entrySet()) { System.out.println(scoutEntry.getKey() + ": " + scoutEntry.getValue().getAsInt()); } }
这两种方法都能完美解决你遇到的动态键问题,第一种适合长期维护的项目(结构清晰),第二种适合快速临时读取数据~
内容的提问来源于stack exchange,提问作者Renato Salvador
相关产品推荐
相关产品推荐

