Android客户端GET请求JSON转POJO的@RequestBody等效方案问询
Android客户端GET请求JSON响应自动转POJO方案
背景
在Spring Boot Web中,我们可以通过@RequestBody注解轻松实现POST请求的JSON自动转换为POJO,示例代码如下:
/** * Defines a route to POST a new transaction * @param transaction the Transaction to POST * @return ResponseEntity<Boolean> Http.Status CREATED or INTERNAL_SERVER_ERROR */ @PostMapping("transactions") public ResponseEntity<Boolean> postTransaction(@RequestBody Transaction transaction){ try { return new ResponseEntity<>(service.postTransaction(transaction), HttpStatus.CREATED); } catch (RuntimeException e) { return new ResponseEntity<>(false, HttpStatus.INTERNAL_SERVER_ERROR); } }
这里的Transaction是自定义POJO类,@RequestBody会自动把请求体的JSON字符串转为Transaction对象,操作非常便捷。
现在需要解决的问题是:Android客户端发送GET请求并接收JSON格式响应时,有没有类似的自动将JSON转换为POJO的方案?客户端已经定义了相同的POJO类,不想手动用Jackson或GSON来解析。
解决方案
Android生态里有几个主流的网络库都支持这种自动序列化/反序列化能力,无需手动编写JSON解析逻辑:
1. Retrofit + Gson Converter
Retrofit是Android常用的网络请求库,通过添加Converter插件就能实现JSON与POJO的自动转换:
- 添加项目依赖(以Gson为例):
dependencies { implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' }
- 定义Retrofit接口,直接声明返回值为目标POJO类:
public interface TransactionApi { @GET("transactions/{id}") Call<Transaction> getTransaction(@Path("id") String transactionId); }
- 初始化Retrofit并发起请求:
Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://your-api-domain.com/") .addConverterFactory(GsonConverterFactory.create()) .build(); TransactionApi api = retrofit.create(TransactionApi.class); Call<Transaction> call = api.getTransaction("123"); call.enqueue(new Callback<Transaction>() { @Override public void onResponse(Call<Transaction> call, Response<Transaction> response) { if (response.isSuccessful()) { // 直接拿到转换好的Transaction对象 Transaction transaction = response.body(); } } @Override public void onFailure(Call<Transaction> call, Throwable t) { // 处理请求失败逻辑 } });
GsonConverterFactory会自动完成JSON到POJO的转换,完全无需手动调用Gson解析。
2. OkHttp + Moshi
如果偏好轻量型JSON库,Moshi搭配OkHttp也能实现自动转换:
- 添加依赖:
dependencies { implementation 'com.squareup.okhttp3:okhttp:4.10.0' implementation 'com.squareup.moshi:moshi:1.14.0' implementation 'com.squareup.moshi:moshi-kotlin:1.14.0' }
- 定义Moshi适配器并发起请求:
OkHttpClient client = new OkHttpClient(); Moshi moshi = new Moshi.Builder().build(); JsonAdapter<Transaction> adapter = moshi.adapter(Transaction.class); Request request = new Request.Builder() .url("https://your-api-domain.com/transactions/123") .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 处理请求失败 } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { String json = response.body().string(); // 自动转换为Transaction对象 Transaction transaction = adapter.fromJson(json); } } });
Moshi适配器已经封装了所有解析逻辑,无需手动处理字段映射。
3. Retrofit + Kotlin协程(Kotlin项目)
如果是Kotlin项目,结合协程能让代码更简洁:
- 添加依赖:
dependencies { implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4' implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' }
- 定义挂起函数接口:
interface TransactionApi { @GET("transactions/{id}") suspend fun getTransaction(@Path("id") transactionId: String): Transaction }
- 发起请求:
val retrofit = Retrofit.Builder() .baseUrl("https://your-api-domain.com/") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(CoroutineCallAdapterFactory()) .build() val api = retrofit.create(TransactionApi::class.java) lifecycleScope.launch { try { val transaction = api.getTransaction("123") // 直接使用转换后的POJO对象 } catch (e: Exception) { // 处理异常逻辑 } }
这些方案都能实现和Spring Boot中@RequestBody类似的自动转换效果,只需定义好POJO类和网络接口即可完成JSON到POJO的转换。
内容的提问来源于stack exchange,提问作者Adam Winter
相关产品推荐
相关产品推荐

