2012-07-25 78 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