2011-02-01 69 views
0

Hy!JSON数组问题

我有一个带有电视频道的JSON阵列,阵列的长度是三个,但是在传输到一个树形图之后,该值只有一个。

请帮助

代码:

try 
      { 

       JSONObject menuobj = this.getJSONObject("responseData"); 
       Log.e("XXX", menuobj.toString()); 
       JSONArray array = menuobj.getJSONArray("countries"); 
       TreeMap<String, Integer> map = new TreeMap<String, Integer>(); 
       for (int i = 0; i < array.length(); i++) 
       { 
        JSONObject obj = new JSONObject(); 
        obj = array.getJSONObject(i); 
        if (obj.getString("name").equals(country)) 
        { 
         Log.e("XXX2", obj.toString()); 
         JSONArray arr = obj.getJSONArray("channels"); 
         Log.e("XXX3", String.valueOf(arr.length())); 
         for (int j = 0; j < arr.length(); j++) 
         { 
          JSONObject obj2 = new JSONObject(); 
          obj2 = arr.getJSONObject(i); 
          map.put(obj2.getString("name"), obj2.getInt("id")); 
         } 
         Log.e("XXX4", String.valueOf(map.size())); 
         return map; 
        } 


       } 

的logcat:

02-01 18:24:20.277: ERROR/XXX(3784): {"countries":[{"id":"1","channels":[{"id":"3","name":"ARD"},{"id":"1","name":"ORF 1"},{"id":"2","name":"ORF 2"}],"name":"Ã?sterreich"},{"id":"2","channels":[{"id":"3","name":"ARD"}],"name":"Deutschland"}]} 
02-01 18:24:20.288: ERROR/XXX2(3784): {"id":"1","channels":[{"id":"3","name":"ARD"},{"id":"1","name":"ORF 1"},{"id":"2","name":"ORF 2"}],"name":"Ã?sterreich"} 
02-01 18:24:20.297: ERROR/XXX3(3784): 3 
02-01 18:24:20.307: ERROR/XXX4(3784): 1 

回答

2

我相信:

obj2 = arr.getJSONObject(i); 

应该

obj2 = arr.getJSONObject(j); 

所以你把同一个对象对键/值的三倍到地图中。

+0

+1 - 好点。 – 2011-02-01 18:37:51

0

您需要使用JSONArrayJSONObject

JSONArray resultJson = new JSONArray(responseDataString); 
0

你米发布一个重要的日志记录细节,称之为XXX3.5。几乎可以肯定的是,地图包含一个元素,因为每次调用map.put()都会传入一个与地图内已有键相同的键。

现在我期望这些键是通道的字符串名称,它们是不同的,很显然,这种期望并不成立。添加日志消息obj2.getString("name")(或者在那里设置断点),可以让您看到映射键的实际内容,以及后续调用覆盖现有映射的原因。为了区分实际的String和一些仅包含字符串的类,输出对象的实际类也很有用。

如果这些元素看起来合理,那么问题可能就是所讨论类中的equals()的松散定义,它将应该看起来不同的元素等同起来。无论如何,更好的日志记录将显示为什么

arr.getJSONObject(0).getString("name").equals(arr.getJSONObject(1).getString("name") 

如果您希望返回false,则返回true。

+0

^^三次ARD 02-01 18:38:46.627:ERROR/XXX3.5(4148):ARD 02-01 18:38:46.627:ERROR/XXX3.5(4148):ARD 02- 01 18:38:46.627:错误/ XXX3.5(4148):ARD – user547995 2011-02-01 18:39:37