JSONArray会覆盖自己

时间:2015-04-06 17:56:00

标签: android arrays json

我想用这种方式创建一个数组:

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"}]

为什么用“旧的”ean变量覆盖数组?

2 个答案:

答案 0 :(得分: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();
        }
    }
}

答案 1 :(得分:0)

您将数据放在同一个对象json中,并在json jsArray中添加相同的引用。因此,当您显示数组的内容时,它会向您显示唯一存在的引用的内容,这是循环中的最后一个影响。

相关问题