如何在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
相关产品推荐
相关产品推荐

