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

使用GSON解析Google Directions API响应遇空指针异常求助

问题1:空指针异常的常见原因

以下是几个大概率触发空指针的问题点:

  • 实体类字段与JSON键名不匹配:Google Directions API的JSON字段采用下划线命名(比如end_address、distance),如果你的实体类用驼峰命名(比如endAddress)却未添加@SerializedName注解,GSON会无法完成字段映射,导致对应字段为null。比如Leg类中end_address字段的正确定义应该是:
    @SerializedName("end_address")
    private String endAddress;
    
  • 集合字段未初始化:如果你的routes或legs集合字段仅声明(比如private List<Route> routes;)而未初始化(private List<Route> routes = new ArrayList<>();),一旦解析逻辑出错导致集合为null,调用get(0)就会触发空指针。
  • 根节点解析错误:Google Directions API的响应根是一个对象(格式为{"routes": [...], ...}),并非直接的数组。如果错误地将整个响应解析为List<DirectionsApiResponse>,而非包含List<Route>的根实体类,那directionsApiResponseList本身就是null,调用get(0)必然抛出空指针。正确的根实体类结构应该是:
    public class DirectionsRootResponse {
        @SerializedName("routes")
        private List<Route> routes;
        // getter方法
    }
    
    解析时需用DirectionsRootResponse response = gson.fromJson(jsonString, DirectionsRootResponse.class);,再通过response.getRoutes().get(0)...获取数据。
  • 嵌套字段映射遗漏:distance和duration是嵌套对象(JSON格式为"distance": {"text": "...", "value": ...}),如果Leg类中未定义对应的嵌套实体类(比如Distance类),而是直接声明private String distance,GSON无法完成解析,导致该字段为null,后续调用getText()就会触发空指针。

问题2:官方GSON解析代码及按需过滤字段

Google没有提供专门针对Google Directions API的GSON解析官方代码,但有两种常用方式实现按需提取字段:

  1. 使用@Expose注解过滤冗余字段:
    给实体类中需要保留的字段添加@Expose注解,再创建GSON实例时启用过滤规则:
    Gson gson = new GsonBuilder()
        .excludeFieldsWithoutExposeAnnotation()
        .create();
    
    这样GSON只会解析带有@Expose注解的字段,自动忽略其他不需要的内容,减少实体类冗余。
  2. 手动解析JsonElement提取目标值:
    无需创建完整实体类,直接遍历JSON节点获取所需数据,同时降低空指针风险:
    JsonElement root = JsonParser.parseString(jsonString);
    JsonArray routes = root.getAsJsonObject().getAsJsonArray("routes");
    JsonObject firstRoute = routes.get(0).getAsJsonObject();
    JsonArray legs = firstRoute.getAsJsonArray("legs");
    JsonObject firstLeg = legs.get(0).getAsJsonObject();
    
    String endAddress = firstLeg.get("end_address").getAsString();
    String distanceText = firstLeg.getAsJsonObject("distance").get("text").getAsString();
    String durationText = firstLeg.getAsJsonObject("duration").get("text").getAsString();
    
    这种方式更灵活,仅提取你需要的字段,无需维护庞大的实体类结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:56:04