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

Android Java如何动态设置@SerializedName注解适配多货币汇率接口响应

@SerializedName 是编译期注解,代码编译完成后就无法动态修改取值,你可以通过以下两种方案实现动态适配不同货币返回字段的需求,首推第一种方案。

方案1:使用Map承接动态key(最简单高效)

直接将 rates 节点定义为 Map 类型,key为动态货币代码(INR/USD/EUR等),value为统一的货币信息实体,无需处理动态注解逻辑:

修改后实体类代码

// 原INR类重命名为通用的CurrencyInfo,内部逻辑无需修改
public class CurrencyInfo {
    @SerializedName("currency_name")
    private String currencyName;
    @SerializedName("rate")
    private String rate;
    @SerializedName("rate_for_amount")
    private String rateForAmount;

    public String getCurrencyName() {
        return currencyName;
    }
    public String getRate() {
        return rate;
    }
    public String getRateForAmount() {
        return rateForAmount;
    }
}

// Rates类修改为Map承接动态key
public class Rates {
    private Map<String, CurrencyInfo> rates;

    public Map<String, CurrencyInfo> getRates() {
        return rates;
    }
}

调用方式

解析完成后直接用你需要的货币代码从Map中取值即可:

// 比如要获取INR对应的信息
CurrencyInfo inrInfo = rates.getRates().get("INR");
// 要获取USD就传"USD"
CurrencyInfo usdInfo = rates.getRates().get("USD");

方案2:自定义Gson反序列化适配器

如果你的业务场景必须用固定字段承接返回值,可以自定义TypeAdapter在解析时动态读取对应货币的字段:

自定义TypeAdapter代码

public class RatesTypeAdapter extends TypeAdapter<Rates> {
    // 传入当前需要匹配的货币代码
    private final String targetCurrencyCode;

    public RatesTypeAdapter(String currencyCode) {
        this.targetCurrencyCode = currencyCode;
    }

    @Override
    public void write(JsonWriter out, Rates value) throws IOException {
        // 无序列化需求可空实现
    }

    @Override
    public Rates read(JsonReader in) throws IOException {
        Rates rates = new Rates();
        CurrencyInfo targetInfo = null;
        in.beginObject();
        while (in.hasNext()) {
            String fieldName = in.nextName();
            if (fieldName.equals(targetCurrencyCode)) {
                // 匹配到目标货币代码时反序列化对应对象
                targetInfo = new Gson().fromJson(in, CurrencyInfo.class);
            } else {
                // 跳过其他货币字段
                in.skipValue();
            }
        }
        in.endObject();
        // 给Rates类设置对应的货币信息,需要你先给Rates类加CurrencyInfo字段和setter
        rates.setCurrencyInfo(targetInfo);
        return rates;
    }
}

调用方式

每次请求不同货币时,创建对应配置的Gson实例做解析:

// 比如当前请求的是INR,就传入"INR"
Gson gson = new GsonBuilder()
    .registerTypeAdapter(Rates.class, new RatesTypeAdapter("INR"))
    .create();
// 用该gson实例解析接口返回的JSON即可
Rates rates = gson.fromJson(jsonResponse, Rates.class);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:57:03