如何使用Retrofit从同一URL获取不同名称的对象
解决Retrofit一次性获取多个经济指标的问题
嘿,我得先给你指出:你当前的IEconomicoAPI类写法没法实现同时获取uf、dolar、euro和utm四个对象的需求。因为@SerializedName的alternate参数是用来处理同一个字段在JSON里可能有不同键名的场景(比如有时候返回"uf",有时候返回"dollar"),但你的目标API是同时返回这四个键的,所以需要为每个指标单独定义字段。
第一步:修正数据模型类
根据目标API的JSON结构,你应该为每个指标都定义对应的字段,示例如下:
import com.google.gson.annotations.SerializedName; public class IEconomicoAPI { private String version; private String autor; private String fecha; @SerializedName("uf") private IEconomicoObject uf; @SerializedName("dolar") private IEconomicoObject dolar; @SerializedName("euro") private IEconomicoObject euro; @SerializedName("utm") private IEconomicoObject utm; // 所有Getter和Setter方法,也可以用Lombok简化代码 public String getVersion() { return version; } public void setVersion(String version) { this.version = version; } public String getAutor() { return autor; } public void setAutor(String autor) { this.autor = autor; } public String getFecha() { return fecha; } public void setFecha(String fecha) { this.fecha = fecha; } public IEconomicoObject getUf() { return uf; } public void setUf(IEconomicoObject uf) { this.uf = uf; } public IEconomicoObject getDolar() { return dolar; } public void setDolar(IEconomicoObject dolar) { this.dolar = dolar; } public IEconomicoObject getEuro() { return euro; } public void setEuro(IEconomicoObject euro) { this.euro = euro; } public IEconomicoObject getUtm() { return utm; } public void setUtm(IEconomicoObject utm) { this.utm = utm; } } // 确保你的IEconomicoObject类能正确映射每个指标的子结构,比如: public class IEconomicoObject { private String nombre; private String unidad_medida; private double valor; // 对应的Getter和Setter public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public String getUnidad_medida() { return unidad_medida; } public void setUnidad_medida(String unidad_medida) { this.unidad_medida = unidad_medida; } public double getValor() { return valor; } public void setValor(double valor) { this.valor = valor; } }
第二步:定义Retrofit接口
接下来创建Retrofit的API接口,定义一个GET请求来获取完整的经济指标数据:
import retrofit2.Call; import retrofit2.http.GET; public interface EconomicoService { @GET("api") Call<IEconomicoAPI> getIndicadoresEconomicos(); }
第三步:发起Retrofit请求
最后,初始化Retrofit并调用接口获取数据:
import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; public class Main { public static void main(String[] args) { Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://mindicador.cl/") .addConverterFactory(GsonConverterFactory.create()) .build(); EconomicoService service = retrofit.create(EconomicoService.class); Call<IEconomicoAPI> call = service.getIndicadoresEconomicos(); // 同步调用(建议在子线程执行,避免阻塞主线程) try { IEconomicoAPI response = call.execute().body(); if (response != null) { // 访问各个指标数据 System.out.println("UF valor: " + response.getUf().getValor()); System.out.println("Dólar valor: " + response.getDolar().getValor()); System.out.println("Euro valor: " + response.getEuro().getValor()); System.out.println("UTM valor: " + response.getUtm().getValor()); } } catch (Exception e) { e.printStackTrace(); } // 或者异步调用(更适合Android等UI场景) /* call.enqueue(new Callback<IEconomicoAPI>() { @Override public void onResponse(Call<IEconomicoAPI> call, Response<IEconomicoAPI> response) { if (response.isSuccessful() && response.body() != null) { IEconomicoAPI data = response.body(); // 在这里处理返回的指标数据 } } @Override public void onFailure(Call<IEconomicoAPI> call, Throwable t) { t.printStackTrace(); } }); */ } }
关键说明
- 原来的
alternate用法不适用当前场景:它是为了兼容JSON中同一数据可能用不同键名返回的情况,而不是同时存在多个键的情况。 - 确保
IEconomicoObject类的字段和API返回的每个指标的子JSON结构完全匹配,如果API返回的子结构还有其他字段(比如fecha),记得在类中添加对应的字段。
内容的提问来源于stack exchange,提问作者Miguel Barra
相关产品推荐
相关产品推荐

