2011-02-01 9 views
0

Hy!JSON配列の問題

私はテレビチャンネルを持つJSON配列を持っていますが、配列の長さは3ですが、ツリーマップに送信した後の値は1つだけです。

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); 

だからあなたがマップにキー/値の3倍の同じオブジェクトのペアを入れている

obj2 = arr.getJSONObject(j); 

でなければなりません。

+0

+1 - 良い点。 –

+0

THX THX THX THX THX THX – user547995

0

JSONArrayJSONObjectなし:

JSONArray resultJson = new JSONArray(responseDataString); 
0

あなただメートル

コードを助けてください重要なロギングの詳細を発行する場合は、XXX3.5としてください。 map.put()を呼び出すたびに、マップ内にあるキーと等しいと見なされるキーが渡されるため、マップには1つの要素が含まれていることはほぼ確実です。

これらのキーは、チャンネルの文字列名であることが予想されます。これらのキーは別個であるため、この期待は保持されていません。 obj2.getString("name")のログメッセージを追加する(またはブレークポイントを設定する)ことで、マップキーが実際に何であるか、および後続の呼び出しが既存のマッピングを上書きする理由を確認できます。オブジェクトの実際のクラスを出力することは、実際のStringと単に文字列を含むいくつかのクラスを区別するのにも役立ちます。

要素が賢明に見える場合、この問題は問題のクラスで緩やかな定義equals()になる可能性があります。これは明確に見えるべき要素に相当します。いずれにしても、より良いロギングが理由を示します。

は、falseを返すと予想されるときにtrueを返します。

+0

^^ 3回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