Java中使用Retrofit提取嵌套JSON对象字段的方法问询
用Retrofit解析嵌套JSON并提取指定字段
步骤1:创建对应JSON结构的实体类
根据你拿到的JSON结构,需要建三个层级的实体类来和JSON字段一一对应:
- 外层响应类(比如叫
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; } }
- 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; } }
- 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
相关产品推荐
相关产品推荐

