无法向ArrayList添加值?Gmaps API数据存储异常求助
排查GMaps API结果存入ArrayList时手机号为空的问题
听起来你碰到了个有点诡异的小bug——明明GMaps API返回的res里手机号是对的,存到result_phone这个ArrayList里就变成空的了,可result_name却能正常输出,这确实让人挠头。我来帮你梳理几个最可能的排查方向和解决办法:
1. 先确认JSON层级是否正确(最常见原因)
GMaps Place Details API的响应结构里,international_phone_number是嵌套在result这个子JSONObject里的,不是直接在顶层响应里。如果你的checkEmptyJsonResponse工具类传入的是顶层的res对象,而不是res.getJSONObject("result"),那肯定拿不到手机号,返回的就是空或者你设置的“Not Available”。
举个正确的调用示例:
// 从API响应中取出result子对象 JSONObject placeResult = res.getJSONObject("result"); // 获取名称(正常工作的逻辑,参考这个) String placeName = checkEmptyJsonResponse(placeResult, "name"); result_name.add(placeName); // 获取手机号(必须和名称用同一个子对象!) String placePhone = checkEmptyJsonResponse(placeResult, "international_phone_number"); result_phone.add(placePhone);
2. 检查自定义工具类checkEmptyJsonResponse的逻辑
你说这个类会返回JSON值或“Not Available”,那得确保它的逻辑没有漏洞:
- 有没有处理
JSONException?比如键不存在的时候会不会抛出异常导致返回空? - 有没有同时判断
obj.has(key)和!obj.isNull(key)?有些情况下键存在但值是null,这时候也要返回“Not Available”。
推荐的工具类实现参考:
public static String checkEmptyJsonResponse(JSONObject obj, String key) { try { // 同时检查键存在且值不为null if (obj.has(key) && !obj.isNull(key)) { return obj.getString(key); } return "Not Available"; } catch (JSONException e) { // 捕获异常,避免崩溃,返回默认值 e.printStackTrace(); return "Not Available"; } }
3. 排查ArrayList的操作时机和初始化
- 确保
result_phone已经正确初始化:ArrayList<String> result_phone = new ArrayList<>();,如果是null的话add操作会抛异常,但你说日志是空,可能是初始化了但没正确添加元素? - 检查日志输出的时机:是不是在
result_phone.add(placePhone)之前就打印了result_phone.toString()?那时候列表当然是空的!建议在添加后立刻打印列表,或者单独打印placePhone的值,确认工具类返回的内容:
Log.d("DebugPhone", "工具类返回的手机号:" + placePhone); result_phone.add(placePhone); Log.d("DebugList", "添加后的手机号列表:" + result_phone.toString());
4. 确认API权限和响应字段
虽然你说res值正确,但还是可以确认下请求的Place Details API有没有请求到international_phone_number字段——GMaps API需要指定fields参数,如果你没包含formatted_phone_number或international_phone_number,那响应里就不会有这个字段。比如请求URL里要加&fields=name,international_phone_number。
按照上面的步骤一步步排查,应该能很快找到问题所在!
内容的提问来源于stack exchange,提问作者user8989957
相关产品推荐
相关产品推荐

