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

