使用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解析官方代码,但有两种常用方式实现按需提取字段:
- 使用@Expose注解过滤冗余字段:
给实体类中需要保留的字段添加@Expose注解,再创建GSON实例时启用过滤规则:
这样GSON只会解析带有Gson gson = new GsonBuilder() .excludeFieldsWithoutExposeAnnotation() .create();@Expose注解的字段,自动忽略其他不需要的内容,减少实体类冗余。 - 手动解析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
相关产品推荐
相关产品推荐

