当前位置: 代码迷 >> Android >> 用Google的API有JSONException生成解决思路
  详细解决方案

用Google的API有JSONException生成解决思路

热度:43   发布时间:2016-05-01 17:51:50.0
用Google的API有JSONException生成
初学Android,照着Android基础教程敲一个利用GoogleAPI翻译各国语言的项目
运行后报的是JSONException,我也不知道JSONException是什么异常
求解释为什么会有JSONException异常
部分代码如下
Java code
private String doTranslate(String original, String from,            String to){        String result = translate.getResources().getString(                R.string.translation_error);        HttpURLConnection con = null;        Log.d(TAG, "doTranslate(" + original + ", " + from + ", "                + to + ")");                try{            // Check if task has been interrupted            if(Thread.interrupted())                throw new InterruptedException();                        // Build RESTful query for Google API            String q = URLEncoder.encode(original, "UTF-8");            URL url = new URL(                    "http://ajax.googleapis.com/ajax/services/language/translate"                    + "?v=1.0" + "&q=" + q + "&langpair=" + from                    + "%7C" + to);            con = (HttpURLConnection)url.openConnection();            con.setReadTimeout(10000 /* milliseconds */);            con.setConnectTimeout(15000 /* milliseconds */);            con.setRequestMethod("GET");            con.addRequestProperty("Referer",                     "http://www.pragprog.com/titles/eband3/hello-android");            con.setDoInput(true);                        // Start the query            con.connect();                        // Check if task has been interrupted            if(Thread.interrupted())                throw new InterruptedException();                        // Read results from the query            BufferedReader reader = new BufferedReader(                    new InputStreamReader(con.getInputStream(), "UTF-8"));            String payload = reader.readLine();            reader.close();                        // Parse to get translated text            JSONObject jsonObject = new JSONObject(payload);            result = jsonObject.getJSONObject("responseData")                    .getString("translatedText")                    .replace("&#39", ".")                    .replace("&amp", "&");                        // Check if task has been interrupted            if(Thread.interrupted())                throw new InterruptedException();        }catch(IOException e){            Log.e(TAG, "IOException", e);        }        catch(JSONException e){            Log.e(TAG, "JSONException", e);        }        catch(InterruptedException e){            Log.d(TAG, "InterruptedException", e);            result = translate.getResources().getString(                    R.string.translation_interrupted);        }        finally{            if(con != null){                con.disconnect();            }        }                // All done        Log.d(TAG, "   -> returned " + result);        return result;    }


------解决方案--------------------
// Parse to get translated text
JSONObject jsonObject = new JSONObject(payload);
result = jsonObject.getJSONObject("responseData")
.getString("translatedText")
.replace("&#39", ".")
.replace("&amp", "&");

你解析json数据包的过程中出现了问题,最好debug到这几行看看,还有,看看payload这个字符串,看看数据格式死否符合标准的json定义
------解决方案--------------------
这个问题比较明显了,你出错的这次,给的json包中,肯定是一次服务器没有找到对应的翻译的返回包,所以你在调用getString("translatedText").由于没有translatedText这个键值,所以出现了exception.
  相关解决方案