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

如何在Android中使用Retrofit解析此类JSON响应数据

在Android中用Retrofit解析带动态键的JSON响应

嘿,我来帮你搞定这个Retrofit解析的问题!你的JSON结构有点特别——里面有几个以数字为键的对象,还有一个顶层的status字段。下面我会一步步带你实现从依赖配置到数据解析的全流程。

1. 添加必要的依赖

首先确保你的build.gradle(Module级别)里添加了Retrofit和Gson转换器的依赖,Gson是Retrofit默认用来解析JSON的工具:

dependencies {
    // Retrofit核心库
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    // Gson转换器,用于JSON和Java对象互转
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
}

你也可以替换成最新版本的Retrofit,这里用的是稳定版本做示例。

2. 定义数据模型类

我们需要两个模型类:一个对应每个位置条目,另一个对应整个响应结构。

2.1 位置条目模型(LocationEntry)

注意JSON里的Long是Java关键字,不能直接用做变量名,所以要用@SerializedName注解来映射这个字段:

import com.google.gson.annotations.SerializedName;

public class LocationEntry {
    @SerializedName("userId")
    private String userId;

    @SerializedName("Long") // 映射JSON里的"Long"字段
    private String longitude;

    @SerializedName("Lat")
    private String latitude;

    @SerializedName("time")
    private String time;

    @SerializedName("date")
    private String date;

    // 记得生成getter和setter方法
    // 如果用Kotlin,直接写data类更简洁:
    // data class LocationEntry(
    //     val userId: String,
    //     @SerializedName("Long") val longitude: String,
    //     val Lat: String,
    //     val time: String,
    //     val date: String
    // )
}

2.2 整个响应模型(LocationResponse)

因为JSON里的0、1、2是动态的数字键,我们可以用Map<String, LocationEntry>来接收这部分数据,再加上顶层的status字段:

import java.util.Map;
import com.google.gson.annotations.SerializedName;

public class LocationResponse {
    // 自动接收所有数字键的位置条目
    private Map<String, LocationEntry> locationMap;

    @SerializedName("status")
    private String status;

    // 生成getter和setter方法
    // Kotlin版本:
    // data class LocationResponse(
    //     val locationMap: Map<String, LocationEntry>,
    //     val status: String
    // )
}

Gson会自动把所有顶层的数字键(0、1、2)都放进locationMap里,键是字符串类型的"0"、"1",值就是对应的LocationEntry对象。

3. 创建Retrofit实例

在你的代码里(比如Application类或者单例类)创建Retrofit实例,配置BaseUrl和Gson转换器:

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class RetrofitClient {
    private static Retrofit retrofit;
    private static final String BASE_URL = "你的API基础地址"; // 替换成你的实际地址

    public static Retrofit getRetrofitInstance() {
        if (retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

4. 定义API接口

创建一个接口来描述你的API请求,比如GET请求:

import retrofit2.Call;
import retrofit2.http.GET;

public interface LocationApi {
    // 替换成你的实际API端点
    @GET("获取位置数据的接口路径")
    Call<LocationResponse> getLocationData();
}

5. 发起请求并解析数据

在你的Activity或者ViewModel里发起请求,处理响应:

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import java.util.ArrayList;
import java.util.List;

// 获取API实例
LocationApi locationApi = RetrofitClient.getRetrofitInstance().create(LocationApi.class);

// 发起请求
Call<LocationResponse> call = locationApi.getLocationData();
call.enqueue(new Callback<LocationResponse>() {
    @Override
    public void onResponse(Call<LocationResponse> call, Response<LocationResponse> response) {
        if (response.isSuccessful() && response.body() != null) {
            LocationResponse locationResponse = response.body();
            // 先检查status是否为success
            if ("success".equals(locationResponse.getStatus())) {
                // 获取所有位置条目
                Map<String, LocationEntry> locationMap = locationResponse.getLocationMap();
                // 如果需要转换成List,直接取Map的值即可
                List<LocationEntry> locationList = new ArrayList<>(locationMap.values());
                
                // 接下来就可以遍历locationList处理每个位置数据了
                for (LocationEntry entry : locationList) {
                    String userId = entry.getUserId();
                    String longitude = entry.getLongitude();
                    // ... 处理其他字段
                }
            } else {
                // 处理请求成功但status不是success的情况
            }
        } else {
            // 处理响应失败的情况
        }
    }

    @Override
    public void onFailure(Call<LocationResponse> call, Throwable t) {
        // 处理网络请求失败的情况,比如打印错误信息
        t.printStackTrace();
    }
});

额外小提醒

别忘了添加网络权限到AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET" />

内容的提问来源于stack exchange,提问作者Nitish Kumar Tiwary

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:02:09