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

如何使用Retrofit从JsonArray中获取单个对象?

解决Retrofit获取数组后日志只显示对象内存地址的问题

哥们,我太懂你现在的头疼了——明明Retrofit已经拿到了API的成功响应,日志里却只输出myapp.com.myapp.LocationsModel@9a0d130这种鬼东西,根本看不到实际的数组数据,更别说提取需要的字符串对象了。别慌,这其实是个很常见的小问题,咱们一步步解决:

问题根源

你直接打印LocationsModel对象的时候,默认调用的是Java父类Object的toString()方法,这个方法本来就只会输出对象的内存地址,不会展示里面的字段值。所以咱们得让日志能输出对象的实际内容。

解决方案一:重写LocationsModel的toString()方法

这是最直接的办法,让对象自己知道怎么把内容打印出来。你可以用IDE(比如Android Studio)自动生成,也可以手动写:

public class LocationsModel {
    // 假设你的模型类有这些字段
    private String locationId;
    private String locationName;
    private String address;

    // 省略getter、setter和构造方法

    @Override
    public String toString() {
        return "LocationsModel{" +
                "locationId='" + locationId + '\'' +
                ", locationName='" + locationName + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

之后再打印LocationsModel对象或者它的数组/列表时,日志就会显示每个对象的具体字段值了。

解决方案二:用序列化工具把对象转成JSON字符串

如果不想重写toString(),可以用Gson或者Jackson这类JSON工具,把整个数组序列化成JSON字符串输出,这样能看到完整的结构:

// 用Gson的例子,记得先添加Gson依赖
Gson gson = new Gson();
// 假设response.body()是你的LocationsModel数组/List
String jsonData = gson.toJson(response.body());
Log.d("LocationData", jsonData);

输出的就是标准的JSON格式,能清晰看到数组里每个对象的所有内容。

解决方案三:确认Retrofit返回类型并直接提取字段

先检查你的Retrofit接口定义是否正确,确保返回的是数组或列表类型:

public interface LocationApi {
    @GET("api/locations")
    Call<List<LocationsModel>> getAllLocations();
}

然后在回调里直接遍历列表,提取你需要的字符串字段就行,不用全量打印:

locationApi.getAllLocations().enqueue(new Callback<List<LocationsModel>>() {
    @Override
    public void onResponse(Call<List<LocationsModel>> call, Response<List<LocationsModel>> response) {
        if (response.isSuccessful() && response.body() != null) {
            List<LocationsModel> locations = response.body();
            // 遍历提取需要的字符串
            for (LocationsModel loc : locations) {
                String locName = loc.getLocationName();
                Log.d("SingleLocation", "地点名称:" + locName);
                // 把locName传到应用的其他模块就行
            }
        }
    }

    @Override
    public void onFailure(Call<List<LocationsModel>> call, Throwable t) {
        // 处理请求失败逻辑
    }
});

按照上面的方法来,你就能看到实际的数组内容,顺利提取需要的字符串对象了。

内容的提问来源于stack exchange,提问作者Trent Pierce

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:53:28