Java中for循环调用JSONObject的put方法输出不符合预期如何解决
问题原因
你将infoObj的实例化代码写在了for循环外部,全程只会创建一个JSONObject对象。Java中对象为引用传递,每次循环执行infoObj.put()时都是修改同一个对象的属性值,往ResultArray中添加的也始终是同一个对象的引用。最终数组里所有元素都会被覆盖为最后一次匹配到的数据,和预期输出不符。
修复方案
将infoObj的实例化逻辑移动到if判断内部,每次匹配到符合条件的数据时都创建新的独立对象,避免属性互相覆盖,修复后代码如下:
try { JSONObject obj = new JSONObject(loadJsonfromAssets()); JSONArray arr = obj.getJSONArray("Sheet1"); JSONObject finalObj = new JSONObject(); JSONArray ResultArray = new JSONArray(); for (int i=0; i<arr.length();i++){ JSONObject obj1 = arr.getJSONObject(i); if (obj1.getString("City").equals("New Delhi")){ Log.d("postal", "Found!"); Toast.makeText(this, "" + obj1.getString("Pincode"), Toast.LENGTH_SHORT).show(); // 每次匹配到数据时新建独立的infoObj对象 JSONObject infoObj = new JSONObject(); infoObj.put("PostOfficeName", obj1.getString("PostOfficeName")); infoObj.put("Pincode",obj1.getString("Pincode")); ResultArray.put(infoObj); } } finalObj.put("Result", ResultArray); System.out.println(finalObj); } catch (JSONException e) { e.printStackTrace(); }
修改后ResultArray中会存储所有匹配到的独立条目,输出结果和预期格式一致。
内容的提问来源于stack exchange,提问作者Abhay
相关产品推荐
相关产品推荐

