2013-12-08 110 views
0

我想要做的是處理活動貨幣JSON字符串並檢索它們的費率值。在android中解析JSON字符串

該網站我使用返回此:

{"target": "EUR", "success": true, "rate": 0.7298, "source": "USD", "amount": 0.73, "message": ""} 

的URL:

http://currency-api.appspot.com/api/USD/EUR.json?key=KEY 

對於美元到歐元的轉換。我想存儲在浮動的利率。我意識到我將不得不使用GSON或類似的東西來解析網站的JSON輸出,但到目前爲止,我還沒有一個可行的解決方案。我目前的AsyncTask看起來是這樣的:

 class AsyncTest extends AsyncTask<Void,Void,Void> 
    { 
     protected void onPreExecute() 
     { 
      super.onPreExecute(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) 
     { 
      try { 
       URL url = new URL("http://currency-api.appspot.com/api/USD/EUR.json?key=KEY"); 
       URLConnection connect = url.openConnection(); 
       BufferedReader in = new BufferedReader(new InputStreamReader(connect.getInputStream())); 
       String jsonObject = ""; 
       String line = ""; 
       while ((line = in.readLine()) != null) 
        jsonObject += line; 
       in.close(); 
       Toast.makeText(getApplicationContext(), jsonObject, Toast.LENGTH_LONG).show(); 
      } catch (MalformedURLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return null; 
     } 
     protected void onPostExecute(Void result) 
     { 
      super.onPostExecute(result);; 
     } 

    } 

這到底是什麼錯誤?它會導致運行時異常。我如何解析這個URL的速率?

+1

什麼是運行時異常?發佈堆棧跟蹤。那裏有大量的JSON解析示例。 –

+0

你應該使用StringBuilder而不是String,它更快:jsonObject .append(line); –

+0

考慮使用[droidQuery](http://bit.ly/droidquery)庫輕鬆獲取數據,然後使用'$ .map(json)'方法解析,該方法將'JSONObject'轉換爲'HashMap'便於解析。 – Phil

回答

0
class AsyncTest extends AsyncTask<Void,Void,Void> 
{ 
    protected void onPreExecute() 
    { 
     super.onPreExecute(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) 
    { 
     try { 
      URL url = new URL("http://currency-api.appspot.com/api/USD/EUR.json?key=KEY"); 
      URLConnection connect = url.openConnection(); 
      BufferedReader in = new BufferedReader(new InputStreamReader(connect.getInputStream())); 
      StringBuilder jsonObject = new StringBuilder(); 
      String line = ""; 
      while ((line = in.readLine()) != null) 
       jsonObject.append(line); 
      in.close(); 
      Toast.makeText(getApplicationContext(), jsonObject.toString(), Toast.LENGTH_LONG).show(); 
      JSONObject json = new JSONObject(jsonObject.toString()); 
      ///// Parse the Json object right here using getString 

     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return null; 
    } 
    protected void onPostExecute(Void result) 
    { 
     super.onPostExecute(result);; 
    } 

} 

解析JSON對象,看看docs

例如

private void parseJson(JSONObject json){ 
    String target = json.getString("target"); 
    boolean success = json.getBoolean("success"); 
    // If the field is optional, use optXXX 
    double rate = json.optDouble("rate", 1d); 
    ...... 

} 
+0

謝謝,我會試試這個。 –

+0

這裏是一個[android解析JSON的例子](http://android.codota.com/scenarios/528e1e7dda0a36cf485bcf50/JSONObject.getString?tag=bumblebee) – drorw

0

嘗試捕捉JSONException。

+1

OP沒有在任何地方創建JSONObject,所以不會拋出JSONException – panini