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

