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

Java中使用Retrofit提取嵌套JSON对象字段的方法问询

用Retrofit解析嵌套JSON并提取指定字段

步骤1:创建对应JSON结构的实体类

根据你拿到的JSON结构,需要建三个层级的实体类来和JSON字段一一对应:

  1. 外层响应类(比如叫ApiResponse):对应最外层的error、msg、data字段
import com.google.gson.annotations.SerializedName;

public class ApiResponse {
    @SerializedName("error")
    private int error;
    
    @SerializedName("msg")
    private String msg; // 对应JSON里的msg字段
    
    @SerializedName("data")
    private ResponseData data;

    // Getter方法,用来获取字段值
    public String getMsg() {
        return msg;
    }

    public ResponseData getData() {
        return data;
    }
}
  1. Data层级类(ResponseData):对应data对象里的内容
import com.google.gson.annotations.SerializedName;
import java.util.List;

public class ResponseData {
    @SerializedName("request_status")
    private String requestStatus; // 对应request_status
    
    @SerializedName("recipients")
    private List<Recipient> recipients;

    // Getter方法
    public String getRequestStatus() {
        return requestStatus;
    }

    public List<Recipient> getRecipients() {
        return recipients;
    }
}
  1. Recipient类:对应recipients数组里的每个对象
import com.google.gson.annotations.SerializedName;

public class Recipient {
    @SerializedName("number")
    private String number;
    
    @SerializedName("status")
    private String status;

    // Getter方法
    public String getNumber() {
        return number;
    }

    public String getStatus() {
        return status;
    }
}

步骤2:定义Retrofit请求接口

写一个接口描述你的API请求:

import retrofit2.Call;
import retrofit2.http.GET; // 要是你的请求是POST就改成@POST,按实际情况调整

public interface ApiService {
    @GET("your-api-path") // 替换成你实际的API路径
    Call<ApiResponse> getApiResponse();
}

步骤3:发起请求并提取需要的字段

初始化Retrofit,发起请求后逐层取出你要的字段:

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class ApiCallDemo {
    public static void main(String[] args) {
        // 初始化Retrofit
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://your-base-url.com/") // 换成你的API基础地址
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        ApiService apiService = retrofit.create(ApiService.class);
        Call<ApiResponse> call = apiService.getApiResponse();

        // 同步请求示例(适合测试或后台场景,Android别在主线程用)
        try {
            ApiResponse response = call.execute().body();
            if (response != null) {
                // 提取msg字段
                String msg = response.getMsg();
                System.out.println("msg: " + msg);

                ResponseData data = response.getData();
                if (data != null) {
                    // 提取request_status字段
                    String requestStatus = data.getRequestStatus();
                    System.out.println("request_status: " + requestStatus);

                    List<Recipient> recipients = data.getRecipients();
                    if (recipients != null && !recipients.isEmpty()) {
                        // 提取第一个收件人的number和status,有多条数据可遍历数组
                        Recipient firstRecipient = recipients.get(0);
                        String number = firstRecipient.getNumber();
                        String status = firstRecipient.getStatus();
                        System.out.println("number: " + number);
                        System.out.println("status: " + status);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 异步请求示例(Android推荐用这个,不会阻塞主线程)
        /*
        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();
                    String msg = apiResponse.getMsg();
                    // 剩余字段提取逻辑和同步请求一致
                }
            }

            @Override
            public void onFailure(Call<ApiResponse> call, Throwable t) {
                t.printStackTrace();
            }
        });
        */
    }
}

几个注意事项

  • 记得给项目添加Retrofit和Gson的依赖(Maven或Gradle均可)
  • 如果JSON字段名和Java字段名完全一致,可以省略@SerializedName注解,但加上能避免大小写或命名规范不一致的问题
  • 处理数组时一定要先判断是否为空,避免空指针异常
  • Android环境下不要在主线程使用同步请求,会导致界面卡顿,优先用异步的enqueue方法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 15:27:47