如何使用Gson将OkHttp3的ResponseBody转换为自定义User对象列表
用Gson将JSON响应转换为User列表的完整指南
没问题,我来一步步帮你把服务器返回的JSON转成User对象的List/ArrayList,用Gson来实现非常简单:
1. 先引入Gson依赖
首先得确保你的项目里已经添加了Gson库。如果是用Gradle构建(Android项目常用),在app/build.gradle的dependencies里加这行:
implementation 'com.google.code.gson:gson:2.10.1' // 可以替换为最新版本号
如果是Maven项目,就在pom.xml里添加:
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> </dependency>
2. 确认User类与JSON字段匹配
你的User类目前的name和password字段刚好对应JSON里的字段,完美适配!如果以后遇到JSON字段和类属性名不一致的情况(比如JSON里是user_name,类里是name),记得用@SerializedName注解做映射,示例如下:
@SerializedName("user_name") private String name;
现在你的User类不需要修改,直接用就行。
3. 修改响应处理代码(核心步骤)
注意:responseBody.string()只能调用一次,调用后流就会关闭,所以必须先把JSON字符串存到变量里,再做打印和解析操作。下面是修改后的完整onResponse方法:
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { int i; int size; try (ResponseBody responseBody = response.body()) { if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); // 保留你原有打印响应头的逻辑 Headers responseHeaders = response.headers(); for (i = 0, size = responseHeaders.size(); i < size; i++) { Log.d("TAG", responseHeaders.name(i) + ": " + responseHeaders.value(i)); } // 1. 先把响应体转成字符串(只能调用一次!) String jsonResponse = responseBody.string(); Log.d("TAG", "Mazal's DB -----> " + jsonResponse); // 2. 初始化Gson实例 Gson gson = new Gson(); // 3. 解析JSON为List<User>:用TypeToken获取泛型类型 Type userListType = new TypeToken<List<User>>() {}.getType(); List<User> userList = gson.fromJson(jsonResponse, userListType); // 4. 测试:打印转换后的User列表 for (User user : userList) { Log.d("TAG", "Parsed User: " + user.toString()); } } catch (JsonSyntaxException e) { // 处理JSON解析异常,比如格式不匹配的情况 Log.e("TAG", "JSON解析失败: " + e.getMessage()); e.printStackTrace(); } }
重要提醒:检查服务器返回的JSON结构
要确保服务器返回的是JSON数组格式,比如:
[{"name":"Alice","password":"123456"},{"name":"Bob","password":"abcdef"}]
如果服务器返回的是嵌套结构(比如外层有个data字段包裹数组),比如:
{"code":200,"data":[{"name":"Alice","password":"123456"},{"name":"Bob","password":"abcdef"}]}
那你需要先创建一个包装类:
public class UserResponse { private int code; private List<User> data; // 生成对应的getter、setter方法 }
然后解析的时候改成:
UserResponse userResponse = gson.fromJson(jsonResponse, UserResponse.class); List<User> userList = userResponse.getData();
这样就能完美把JSON转换成你需要的User列表啦!
内容的提问来源于stack exchange,提问作者Eli Kozinets
相关产品推荐
相关产品推荐

