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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:05:22