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

如何在Kotlin中通过Retrofit从JSON提取字段名作为数组

Android中用Retrofit解析JSON并将rates转为Map/List的实现方法

核心思路:用Map直接接收rates字段

因为你的rates是JSON对象结构,Retrofit默认搭配的Gson转换器原生支持将JSON键值对解析为Map,这是最简便的实现方式,无需额外自定义转换器。

1. 定义数据模型类

Kotlin示例

data class CurrencyResponse(
    val success: Boolean,
    val timestamp: Long,
    val base: String,
    val date: String,
    val rates: Map<String, Double> // 用Map接收货币代码与汇率的键值对
)

Java示例

public class CurrencyResponse {
    private boolean success;
    private long timestamp;
    private String base;
    private String date;
    private Map<String, Double> rates;

    // 生成Getter/Setter方法(或用Lombok简化)
    public boolean isSuccess() { return success; }
    public void setSuccess(boolean success) { this.success = success; }
    public long getTimestamp() { return timestamp; }
    public void setTimestamp(long timestamp) { this.timestamp = timestamp; }
    public String getBase() { return base; }
    public void setBase(String base) { this.base = base; }
    public String getDate() { return date; }
    public void setDate(String date) { this.date = date; }
    public Map<String, Double> getRates() { return rates; }
    public void setRates(Map<String, Double> rates) { this.rates = rates; }
}

2. 定义Retrofit接口

Kotlin示例

interface CurrencyApi {
    @GET("latest") // 替换为你的实际接口路径
    suspend fun getLatestRates(@Query("base") base: String): Response<CurrencyResponse>
}

Java示例

public interface CurrencyApi {
    @GET("latest") // 替换为你的实际接口路径
    Call<CurrencyResponse> getLatestRates(@Query("base") String base);
}

3. 初始化Retrofit并发起请求

Kotlin初始化与请求(协程版)

// 初始化Retrofit
val retrofit = Retrofit.Builder()
    .baseUrl("https://your-api-domain.com/") // 替换为你的API域名
    .addConverterFactory(GsonConverterFactory.create())
    .build()

val currencyApi = retrofit.create(CurrencyApi::class.java)

// 发起请求并处理数据
viewModelScope.launch {
    try {
        val response = currencyApi.getLatestRates("EUR")
        if (response.isSuccessful) {
            response.body()?.let { resp ->
                // 将货币代码转为List
                val currencyCodeList = resp.rates.keys.toList()
                // 或转为数组
                val currencyCodeArray = resp.rates.keys.toTypedArray()
                
                // 后续业务处理
                Log.d("Currency", "货币代码列表: $currencyCodeList")
            }
        }
    } catch (e: Exception) {
        e.printStackTrace()
    }
}

Java初始化与请求(回调版)

// 初始化Retrofit
Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://your-api-domain.com/") // 替换为你的API域名
    .addConverterFactory(GsonConverterFactory.create())
    .build();

CurrencyApi currencyApi = retrofit.create(CurrencyApi.class);

// 发起请求并处理数据
currencyApi.getLatestRates("EUR").enqueue(new Callback<CurrencyResponse>() {
    @Override
    public void onResponse(Call<CurrencyResponse> call, Response<CurrencyResponse> response) {
        if (response.isSuccessful()) {
            CurrencyResponse resp = response.body();
            if (resp != null) {
                // 将货币代码转为List
                List<String> currencyCodeList = new ArrayList<>(resp.getRates().keySet());
                // 或转为数组
                String[] currencyCodeArray = resp.getRates().keySet().toArray(new String[0]);
                
                // 后续业务处理
                Log.d("Currency", "货币代码列表: " + currencyCodeList);
            }
        }
    }

    @Override
    public void onFailure(Call<CurrencyResponse> call, Throwable t) {
        t.printStackTrace();
    }
});

补充:如需封装为实体类列表(可选)

如果需要将rates转为List<Rate>(每个元素包含货币代码和汇率),可以自定义Gson的TypeAdapter,但这种方式比直接用Map繁琐,仅在业务有强需求时使用。示例如下:

定义Rate实体类

data class Rate(val code: String, val value: Double)

自定义TypeAdapter

class RateListTypeAdapter : TypeAdapter<List<Rate>>() {
    override fun write(out: JsonWriter, value: List<Rate>?) {
        // 序列化逻辑(如果需要)
    }

    override fun read(`in`: JsonReader): List<Rate> {
        val rates = mutableListOf<Rate>()
        `in`.beginObject()
        while (`in`.hasNext()) {
            val code = `in`.nextName()
            val value = `in`.nextDouble()
            rates.add(Rate(code, value))
        }
        `in`.endObject()
        return rates
    }
}

注册TypeAdapter到Gson

val gson = GsonBuilder()
    .registerTypeAdapter(object : TypeToken<List<Rate>>() {}.type, RateListTypeAdapter())
    .create()

// 初始化Retrofit时使用自定义Gson
val retrofit = Retrofit.Builder()
    .baseUrl("https://your-api-domain.com/")
    .addConverterFactory(GsonConverterFactory.create(gson))
    .build()

此时数据模型类中的rates字段可改为List<Rate>,直接获取包含代码和汇率的列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:40:28