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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:47:03