2015-04-06 77 views
0

我想創建一個數組是這樣的:JSONArray覆蓋本身

json = new JSONObject(); 
jsArray = new JSONArray(); 
for (int i = 1; i < j; i++) { 
    CheckBox checkBox = (CheckBox) findViewById(i); 
    if (checkBox.isChecked()) { 
     try { 
      String ean = (String) checkBox.getText(); 
      json.put("ean", ean); 
      jsArray.put(json); 
      Log.v("jsArray", jsArray.toString()); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

我得到這個從代碼(最後一行是重要的一個):

04-06 19:07:02.238: V/jsArray(9894): [{"ean":"8029694000"}] 
04-06 19:07:02.238: V/jsArray(9894): [{"ean":"8029694200"},{"ean":"8029694200"}] 
04-06 19:07:02.238: V/jsArray(9894): [{"ean":"8029694300"},{"ean":"8029694300"},{"ean":"8029694300"}] 

但我想這一點:

[{"ean":"8029694000"},{"ean":"8029694200"},{"ean":"8029694300"}] 

爲什麼Array被「舊」ean變量覆蓋?

+0

它總是與jsArray重複添加的json相同。 – sschrass

回答

1

正如@SatelliteSD所述;您每次迭代使用相同的JSONObject。這是每次更新THAT對象中的值並且由於該數組具有對同一對象的多個引用;它會多次輸出相同的值。
重寫爲這樣的事情應該可以解決問題。

jsArray = new JSONArray(); 
for (int i = 1; i < j; i++) { 
    CheckBox checkBox = (CheckBox) findViewById(i); 
    if (checkBox.isChecked()) { 
     try { 
      String ean = (String) checkBox.getText(); 
      JSONObject json = new JSONObject(); 
      json.put("ean", ean); 
      jsArray.put(json); 
      Log.v("jsArray", jsArray.toString()); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 
+0

謝謝你,解釋清楚並解決了它 – zauber3r

0

你把你的數據相同的對象json內,裏面你JSON jsArray您還添加了相同的參考。所以當你顯示數組的內容時,它會向你顯示唯一存在的引用的內容,它是循環中的最後一個引用。