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

从iOS转Android:如何用Gson直接获取嵌套JSON的distance.value

Gson/Retrofit获取嵌套字段value的解决方案(无需额外Model类)

嘿,刚从iOS转Android开发的话,确实会遇到一些库之间的差异问题~首先明确告诉你:Gson并不支持像ObjectMapper那样用@SerializedName("distance.value")这种点路径语法直接映射嵌套字段,直接这么写是无效的。不过不用慌,有两种方法能实现你“不用额外创建DistanceModel类,直接在BaseModel里获取distance的value”的需求,给你详细说说:

方案一:自定义Json反序列化器(灵活适配复杂场景)

这种方法适合有复杂解析逻辑的场景,通过手动解析JSON来提取嵌套字段:

  1. 先在BaseModel里定义接收value的字段:
public class BaseModel {
    private int distanceValue;

    // getter & setter
    public int getDistanceValue() {
        return distanceValue;
    }

    public void setDistanceValue(int distanceValue) {
        this.distanceValue = distanceValue;
    }
}
  1. 自定义反序列化器,手动提取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;
    }
}
  1. 把反序列化器注册到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:12:50