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

如何将POJO类字段映射到API返回字符串,实现多JSON键名匹配取值?

解决方案

1. 快速实现三键接收

你当前使用的@SerializedName别名映射是Gson官方原生支持的合法方案,只需修改alternate参数为字符串数组,加入第三个匹配键即可:

@SerializedName(value = "cellFilter", alternate = {"tissueFilter", "applicationFilter"})
private String filterName;

注意事项

如果同一个接口返回的JSON中同时存在多个filter键,Gson会以JSON中最后出现的键的值为准赋值给filterName,从你提供的三类返回结构来看,每次只会出现一个filter键,因此该方案完全适配你的场景。

2. 方案优劣对比与优化方向

当前方案适用场景

如果你的业务仅需要提取过滤值,不需要区分值的来源类型,当前方案就是最优解:

  • 无需额外编码、无需自定义反序列化逻辑,性能最优
  • POJO结构精简,没有冗余字段
  • 官方原生支持,兼容性高

复杂场景优化方案

如果后续需要区分filterName的来源类型,或者会新增更多filter匹配规则,可以改用自定义Gson反序列化器实现,灵活性更高:

步骤1:给POJO新增来源标识字段

private String filterName;
// 新增字段记录filter来源:tissue/cell/application
private String filterType;
// 其余公共字段url、sortOrder、imageId保持不变

步骤2:编写自定义反序列化器

import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import java.lang.reflect.Type;

public class FilterModelDeserializer implements JsonDeserializer<FilterModel> {
    @Override
    public FilterModel deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonObject jsonObj = json.getAsJsonObject();
        FilterModel model = new FilterModel();
        // 赋值公共字段
        model.setUrl(jsonObj.get("url").getAsString());
        model.setSortOrder(jsonObj.get("sortOrder").getAsInt());
        model.setImageId(jsonObj.get("imageId").getAsString());
        // 匹配filter键并赋值
        if (jsonObj.has("tissueFilter")) {
            model.setFilterName(jsonObj.get("tissueFilter").getAsString());
            model.setFilterType("tissue");
        } else if (jsonObj.has("cellFilter")) {
            model.setFilterName(jsonObj.get("cellFilter").getAsString());
            model.setFilterType("cell");
        } else if (jsonObj.has("applicationFilter")) {
            model.setFilterName(jsonObj.get("applicationFilter").getAsString());
            model.setFilterType("application");
        }
        return model;
    }
}

步骤3:注册反序列化器到Gson实例

Gson gson = new GsonBuilder()
    .registerTypeAdapter(FilterModel.class, new FilterModelDeserializer())
    .create();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:45:03