2012-07-25 37 views
0

我想從一個JSON陣列解析這個對象:我如何通過Handler解析JSONObject屬性的動態JSONArray?

{... 「平均」:8.492619161922457352960767294, 「符號」: 「mtgoxUSD」, 「低」:8.391000000000}

的JSONArray是動態的,所以有時它是數組中的第73,74或75個對象,並且數組中沒有任何對象具有名稱。我目前使用此代碼來解析它。當我的特定對象處於第75位時它工作正常,但當它不在時會崩潰。

try { 
     JSONArray json = JSONfunctions2.getJSONfromURL("http://bitcoincharts.com/t/markets.json"); 
     JSONObject forex = json.getJSONObject(75); 
     String btc = forex.getString("avg");    
     currencyBTC = Double.parseDouble(btc); 
}catch(JSONException e)  { 
    Log.e("log_tag", "Error parsing data "+e.toString()); 
}  

是否有可能通過它的屬性來識別對象,因爲數組中的對象沒有名稱?我該如何解決這個問題?先謝謝你。


編輯:

這個有點工作,但只從陣列中的最後一個對象返回值。我如何處理這個問題,以便我可以解析我的特定對象,而不僅僅是最後一個? ...

try { 
JSONArray jArray = JSONfunctions2.getJSONfromURL("http://bitcoincharts.com/t/markets.json"); 
String symbol = "mtgoxUSD"; 
for (int i = 0; i < jArray.length(); i++) { 
    JSONObject forex = jArray.getJSONObject(i); 
    String mtgoxUSD = forex.getString("symbol"); 
    if (mtgoxUSD == symbol) { 
     String btc = forex.getString("avg");    
     double currencyBTC = Double.parseDouble(btc); 
    } 
} 
} catch (Exception e) { 
Log.e("log_tag", "Error parsing data "+ e.toString()); 
} 
+0

打出來的'「mtgoxUSD」'如果'if'語句來'String'像我有它。我相信那就是錯誤的地方。但看着它,我看不出它是如何給你描述的結果...... – jnthnjns 2012-07-26 02:24:50

+0

我想也許我可以以某種方式解析一切都變成一個ArrayList,然後從ArrayList中 – 2012-07-26 03:00:29

+0

對不起,我看了你的最後一個註釋錯誤得到它,當然你可以解析一個'ArrayList',只需在'for'循環外部設置Array,然後使用'add'將值添加到List內部。我以爲你只想要一個價值。你原來的問題得到了回答。 – jnthnjns 2012-07-26 12:24:42

回答

1

這是我解析JSON在Android應用程序的方式:

String s = client.getBaseURI("http://bitcoincharts.com/t/markets.json"); // Json format 
JSONArray array = new JSONArray(s); 
JSONObject obj;  
for (int i = 0; i < array.length(); i++) { 
    obj = (JSONObject) array.get(i); 
    double average =Double.parsedouble(obj.get("avg").toString())); 
    String symbol = obj.get("symbol").toString(); 
    double low = Double.parsedouble(obj.get("low").toString()); 
} 

我還想補充一點,我使用HTTP客戶端庫從服務器獲取數據。有關於如何使用HTTP客戶端,您在這個環節我的回答更多信息:HTTP Client

+0

這要求每個JSONObject包含一個'avg'字符串。 – yoshi 2012-07-25 20:54:45

+1

@Ali - 如果你正在開發薑餅或「更好」,你應該從'HTTPClient'改爲'HttpURLConnection'。從Android開發博客:「對於薑餅和更好的,HttpURLConnection是最好的選擇,它的簡單API和小尺寸使其非常適合Android,透明壓縮和響應緩存減少網絡使用,提高速度並節省電池。 HttpURLConnection;這是我們將來會耗費精力的地方。「 [來源](http://android-developers.blogspot.com/2011/09/androids-http-clients.html) – jnthnjns 2012-07-25 21:32:55

+0

我很感激你的偉大信息。 – Ali 2012-07-25 21:38:35

0

「75」也是動態的嗎?意思是,數字會根據用戶輸入而改變嗎?如果是這樣,你需要有一個手柄,但無論如何,只要用一個for循環,類似如下:

try { 
    JSONArray jArray = JSONfunctions2.getJSONfromURL("http://bitcoincharts.com/t/markets.json"); 
    String symbol = "mtgoxUSD"; 
    for (int i = 0; i < jArray.length(); i++) { 
     JSONObject forex = jArray.getJSONObject(i); 
     String mtgoxUSD = forex.getString("symbol"); 
     if (mtgoxUSD == symbol) { 
      String btc = forex.getString("avg");    
      double currencyBTC = Double.parseDouble(btc); 
     } 
    } 
} catch (Exception e) { 
    Log.e("log_tag", "Error parsing data "+ e.toString()); 
} 
+0

「75」不會根據用戶輸入而改變。我打算得到的對象在這種情況下處於第75位,但是它的位置隨機變化在我想要解析的數組中。如果有幫助,我總是想要的對象包含字符串「symbol」:mtgoxUSD。 – 2012-07-25 20:51:32

+0

如果它總是包含該字符串,那麼只需搜索該字符串的數組 – jnthnjns 2012-07-25 20:53:57

+0

我很感謝您編輯。但它不能正確解析。它循環遍歷整個數組,並在最後一個對象ruxumZAR中設置String mtgoxUSD等於「symbol」。有沒有辦法停止在我想要的對象循環? – 2012-07-26 00:27:47