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

如何在Retrofit中处理含动态Key的JSON响应?

处理Retrofit中含动态Key的JSON响应转POJO

作为Retrofit新手遇到动态Key的JSON转POJO确实有点懵,我来给你捋捋最实用的解决办法,完全适配你给出的响应结构:

核心思路:用Map接收动态Key的部分

你的响应里大部分字段是固定的,只有key_dynamic对应的对象包含动态Key,这种情况下直接用Map来定义这个字段是最简单高效的方式,Gson(Retrofit默认的JSON转换器)会自动把JSON对象转成Map结构。

步骤1:定义POJO类

根据你的响应结构,我们可以这样写POJO:

public class ApiResponse {
    // 固定字段正常定义
    private String key_fixed1;
    // 用Map接收动态Key的对象,泛型根据实际value类型调整
    // 如果动态Key对应的value是固定结构的对象,就把Object换成对应的POJO类
    private Map<String, Object> key_dynamic;
    private String key_fixed2;
    private String key_fixed3;

    // 生成Getters和Setters,或者用Lombok的@Data注解简化代码
    public String getKey_fixed1() {
        return key_fixed1;
    }

    public void setKey_fixed1(String key_fixed1) {
        this.key_fixed1 = key_fixed1;
    }

    public Map<String, Object> getKey_dynamic() {
        return key_dynamic;
    }

    public void setKey_dynamic(Map<String, Object> key_dynamic) {
        this.key_dynamic = key_dynamic;
    }

    // 其他字段的Getters和Setters同理
}

进阶:如果动态Key的value是固定结构

假设key_dynamic里的每个动态Key对应的value是一个固定格式的对象,比如:

"key_dynamic": {
  "dynamic_key_1": {"id": 1, "content": "test1"},
  "dynamic_key_2": {"id": 2, "content": "test2"}
}

那我们可以先定义这个固定结构的POJO:

public class DynamicItem {
    private int id;
    private String content;

    // Getters和Setters
}

然后把ApiResponse里的key_dynamic改成:

private Map<String, DynamicItem> key_dynamic;

步骤2:Retrofit接口和调用

Retrofit的配置和接口定义和普通情况一样,因为Gson会自动处理Map的转换:

// 构建Retrofit实例
Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("你的API基础地址")
    .addConverterFactory(GsonConverterFactory.create())
    .build();

// 定义API接口
public interface ApiService {
    @GET("你的接口路径")
    Call<ApiResponse> getApiResponse();
}

// 发起请求并处理响应
ApiService service = retrofit.create(ApiService.class);
Call<ApiResponse> call = service.getApiResponse();
call.enqueue(new Callback<ApiResponse>() {
    @Override
    public void onResponse(Call<ApiResponse> call, Response<ApiResponse> response) {
        if (response.isSuccessful() && response.body() != null) {
            ApiResponse apiResponse = response.body();
            // 遍历动态Key的Map
            Map<String, DynamicItem> dynamicMap = apiResponse.getKey_dynamic();
            for (Map.Entry<String, DynamicItem> entry : dynamicMap.entrySet()) {
                String dynamicKey = entry.getKey();
                DynamicItem item = entry.getValue();
                // 这里处理每个动态Key和对应的对象
                System.out.println("动态Key: " + dynamicKey + ", 内容ID: " + item.getId());
            }
        }
    }

    @Override
    public void onFailure(Call<ApiResponse> call, Throwable t) {
        // 处理请求失败
        t.printStackTrace();
    }
});

特殊情况补充

如果你的动态Key是在JSON根节点(而不是嵌套在key_dynamic里),那可以直接把整个响应转成Map<String, Object>,或者用Gson的@JsonAdapter自定义转换器,但这种情况在你的问题里不适用,就不多展开了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:23:12