使用Retrofit2+Rx请求API时无法正确解析JSON数组问题
问题分析与解决方案
看起来你遇到的问题主要分为两部分:一是deviceResults.body().toString()没输出预期的JSON内容,二是无法正确访问解析后的设备数组。我一步步帮你排查和解决:
1. 为什么toString()不输出JSON内容?
这是个常见误解——Java对象默认的toString()只会输出类名+哈希值(比如com.yourpackage.DeviceResult@1234abcd),并不会把对象序列化成JSON字符串。如果想查看解析后的对象对应的JSON结构,得手动用Gson(或你用的JSON解析库)来序列化:
// 确保已导入Gson依赖 Gson gson = new Gson(); Log.i("Devices_body", gson.toJson(deviceResults.body()));
这样就能看到和API返回一致的JSON内容了。
2. 无法访问设备数组的可能原因及修复方案
原因一:Retrofit未配置JSON解析转换器
如果你的RetrofitHelper没有添加GsonConverterFactory,Retrofit就无法自动把API返回的JSON解析成DeviceResult对象,此时body()可能为null,或者解析后的devices列表为空。
检查你的Retrofit构建代码,确保包含以下关键配置:
Retrofit retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(GsonConverterFactory.create()) // 必须添加:JSON解析核心转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) // RxJava适配,保留原有配置 .client(new OkHttpClient.Builder().build()) .build();
没有这个转换器的话,Retrofit不知道如何处理JSON响应,自然无法正确解析出devices数组。
原因二:实体类细节优化
你的实体类已经匹配了current和uid字段,不过有两个小调整能避免潜在问题:
- 将
DeviceResult中的ArrayList<Device>改为List<Device>,Gson默认会生成ArrayList实例,用父接口List更通用,完全不影响解析:public class DeviceResult { private List<Device> devices; // getter和setter保持不变 } - 如果后续需要用到其他字段(比如
id、browser),直接在Device类中添加对应的字段和getter/setter即可,Gson会自动忽略未定义的字段,不会干扰现有解析逻辑。
原因三:未检查body()是否为null
即使isSuccessful()返回true(响应码200-299),响应体也可能为null(比如响应码204 No Content)。所以在访问devices之前,一定要先做null检查:
listObservable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(deviceResults -> { if (deviceResults.isSuccessful()) { DeviceResult result = deviceResults.body(); if (result != null) { List<Device> devices = result.getDevices(); if (devices != null && !devices.isEmpty()) { // 这里可以正常遍历设备数组了 for (Device device : devices) { Log.i("Device Info", "UID: " + device.getUid() + ", Current: " + device.isCurrent()); } } else { Log.i("Devices", "设备列表为空或未解析成功"); } } else { Log.i("Devices", "响应体为null"); } } else { Log.i("Devices", "请求失败,响应码:" + deviceResults.code()); } }, throwable -> Log.e("Error get devices", throwable.getMessage(), throwable));
最后验证步骤
- 确认
RetrofitHelper中正确配置了GsonConverterFactory - 用
Gson.toJson()代替直接调用toString()查看解析结果 - 添加null检查后,尝试遍历
devices列表
按照这些步骤调整后,你应该就能正常访问解析后的设备数组了。
内容的提问来源于stack exchange,提问作者Sina Rahimi
相关产品推荐
相关产品推荐

