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

使用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));

最后验证步骤

  1. 确认RetrofitHelper中正确配置了GsonConverterFactory
  2. 用Gson.toJson()代替直接调用toString()查看解析结果
  3. 添加null检查后,尝试遍历devices列表

按照这些步骤调整后,你应该就能正常访问解析后的设备数组了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:17:17