Android调用谷歌翻译API时出现String无法转换为JSONObject错误
问题根因
报错信息已经明确了故障链路:
- 请求谷歌翻译接口后,返回的响应不是预期的JSON格式,而是HTML文档(响应开头的
<!DOCTYPE是HTML文档的标准标记),所以直接传入JSONObject构造函数会抛出类型不匹配异常 - 后续的空指针异常是因为JSON解析失败后
localJSONObject为空,后续代码直接调用了该对象的length()方法导致崩溃
你调用的https://translate.google.com/translate_a/t是谷歌未对外公开的私有接口,本身没有稳定性承诺,之前能正常调用现在报错,核心原因有两个:
- 你当前使用的
AndroidTranslate/2.5.3是非常老旧的客户端UA,谷歌已经停止对该版本客户端的支持,直接拦截了对应请求 - 谷歌近期调整了私有接口的校验规则,
client=at等旧参数已经失效,请求被拦截后返回错误提示页或人机验证页
修复方案
- 先确认响应具体内容,在读取到
str1后新增日志打印,定位具体拦截原因:
str1 = new BufferedReader(new InputStreamReader(localDefaultHttpClient.execute (new HttpPost("https://translate.google.com/translate_a/t?client=at&sc=1&v=2.0&sl=" + Global.lan1 + "&tl=" + Global.lan2 + "&ie=UTF-8&oe=UTF-8&text=" + URLEncoder.encode(params[0], "UTF-8"))).getEntity().getContent(), "utf-8"), 8).readLine(); // 新增以下日志输出完整响应 Log.d("TRANSLATE_RESP", str1);
- 长期稳定方案:废弃私有接口,改用谷歌官方公开的Cloud Translation API,走正规鉴权流程调用,不会被随意拦截。
- 临时兼容方案(仍有被拦截风险):
- 更新请求的User-Agent为当前主流浏览器的UA,替换原有旧安卓翻译客户端的UA,例如:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 - 修改请求参数中的
client=at为client=gtx,适配谷歌最新的接口参数要求 - 新增
Accept: application/json请求头,明确要求接口返回JSON格式内容
- 代码层面增加兜底逻辑,避免崩溃:
if (str1 != null) { try { localJSONObject = new JSONObject(str1); // 新增非空判断后再执行业务逻辑 if (localJSONObject != null) { // 原有调用length()等业务逻辑放在这里 } } catch (Exception e) { e.printStackTrace(); // 解析失败的兜底逻辑,比如提示用户翻译失败 } }
内容的提问来源于stack exchange,提问作者user3686177
相关产品推荐
相关产品推荐

