从iOS转Android:如何用Gson直接获取嵌套JSON的distance.value
Gson/Retrofit获取嵌套字段value的解决方案(无需额外Model类)
嘿,刚从iOS转Android开发的话,确实会遇到一些库之间的差异问题~首先明确告诉你:Gson并不支持像ObjectMapper那样用@SerializedName("distance.value")这种点路径语法直接映射嵌套字段,直接这么写是无效的。不过不用慌,有两种方法能实现你“不用额外创建DistanceModel类,直接在BaseModel里获取distance的value”的需求,给你详细说说:
方案一:自定义Json反序列化器(灵活适配复杂场景)
这种方法适合有复杂解析逻辑的场景,通过手动解析JSON来提取嵌套字段:
- 先在
BaseModel里定义接收value的字段:
public class BaseModel { private int distanceValue; // getter & setter public int getDistanceValue() { return distanceValue; } public void setDistanceValue(int distanceValue) { this.distanceValue = distanceValue; } }
- 自定义反序列化器,手动提取
distance.value的值:
public class BaseModelDeserializer implements JsonDeserializer<BaseModel> { @Override public BaseModel deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { BaseModel model = new BaseModel(); JsonObject rootObj = json.getAsJsonObject(); // 解析嵌套的distance对象,取出value JsonObject distanceObj = rootObj.getAsJsonObject("distance"); if (distanceObj != null) { int value = distanceObj.get("value").getAsInt(); model.setDistanceValue(value); } // 这里可以继续处理BaseModel的其他字段 return model; } }
- 把反序列化器注册到Gson实例,并配置给Retrofit:
// 创建带自定义反序列化器的Gson实例 Gson gson = new GsonBuilder() .registerTypeAdapter(BaseModel.class, new BaseModelDeserializer()) .create(); // 配置Retrofit时使用这个Gson Retrofit retrofit = new Retrofit.Builder() .baseUrl("你的接口基础地址") .addConverterFactory(GsonConverterFactory.create(gson)) .build();
方案二:嵌套静态内部类(简洁省心,无需额外类文件)
如果你的解析逻辑比较简单,这种方法更省心——在BaseModel内部定义一个私有的静态内部类,用来临时接收distance对象,既不用额外创建类文件,也能自动映射字段:
public class BaseModel { // 用内部类接收distance对象,对外不可见 @SerializedName("distance") private DistanceWrapper distanceWrapper; // 私有静态内部类,仅本类使用 private static class DistanceWrapper { @SerializedName("value") private int value; } // 对外暴露获取distance value的方法 public int getDistanceValue() { // 做空值判断,避免空指针 return distanceWrapper != null ? distanceWrapper.value : 0; } }
这种方式不需要额外的反序列化逻辑,Gson会自动完成映射,而且内部类是私有的,不会对外暴露,完全符合你“不想额外创建DistanceModel类”的需求。
内容的提问来源于stack exchange,提问作者Aditya Srivastava
相关产品推荐
相关产品推荐

