Ну, я думаю, что в этом случае часть кода лучше, чем тысячи объяснений:
Мой код:
ArrayList<String[]> req = new ArrayList<String[]>(DAO.getInstance().dropList(request.getParameter("rname")));
JSONObject j = new JSONObject();
JSONArray m = new JSONArray();
for(String[] s : req){
try{
j.put("id",s[0]);
j.put("name",s[1]);
m.put(j);
System.out.println("id and name from DAO : " + s[0] + " " + s[1]);
System.out.println("JSON object : " + j);
System.out.println("JSON array : " + m);
}catch (Exception e){}
}
Консоль :
id and name from DAO : 1 Bob Sinclar
JSON object : {"id":"1","name":"Bob Sinclar"}
JSON array : [{"id":"1","name":"Bob Sinclar"}]
id and name from DAO : 2 Kurt Cobain
JSON object : {"id":"2","name":"Kurt Cobain"}
JSON array : [{"id":"2","name":"Kurt Cobain"},{"id":"2","name":"Kurt Cobain"}]
id and name from DAO : 3 AAA AAcc
JSON object : {"id":"3","name":"AAA AAcc"}
JSON array : [{"id":"3","name":"AAA AAcc"},{"id":"3","name":"AAA AAcc"},{"id":"3","name":"AAA AAcc"}]
id and name from DAO : 4 Bruce Wayne
JSON object : {"id":"4","name":"Bruce Wayne"}
JSON array : [{"id":"4","name":"Bruce Wayne"},{"id":"4","name":"Bruce Wayne"},{"id":"4","name":"Bruce Wayne"},{"id":"4","name":"Bruce Wayne"}]
id and name from DAO : 5 Tyler Dordon
JSON object : {"id":"5","name":"Tyler Dordon"}
JSON array : [{"id":"5","name":"Tyler Dordon"},{"id":"5","name":"Tyler Dordon"},{"id":"5","name":"Tyler Dordon"},{"id":"5","name":"Tyler Dordon"},{"id":"5","name":"Tyler Dordon"}]
Как вы можете видеть вместо добавления нового элемента, он заменяет весь элемент на последнюю запись, например, я добавлял указатель на свой JSONObject, а не его содержимое...
Есть идеи, ребята?
Инициализируйте свой JSONObject
в цикле.
for(String[] s : req){
try{
JSONObject j = new JSONObject();
...
... в противном случае вы обновите ссылку на JSONObject
и добавите ее снова в JSONArray
, следовательно добавив несколько копий одного и того же JSONObject
.
Прежде чем JSONObject
и JSONArray
будут сериализованы, они ведут себя как обычный Java- Object
s, поскольку изменения в методах, вызываемых в одной и той же ссылке, применяются к одному и тому же экземпляру.
Следовательно, после сериализации вы получите несколько копий последнего обновленного JSONObject
в своем JSONArray
.