Java使用org.json.simple时JSONArray内JSONObject重复及空指针异常问题
解决org.json.simple.JSONArray重复填充最后一个对象的问题
嘿,我太懂你踩的这个坑了!用org.json.simple创建包含多个JSONObject的JSONArray时,结果数组里全是最后一个对象的重复值,这其实是个典型的对象引用陷阱,咱们一步步来搞定它。
问题根源
你大概率是在循环外面只创建了一个JSONObject实例,然后每次循环里只是更新这个对象的键值对,再把它添加到JSONArray里。但JSONArray存储的是对象的引用地址,不是对象的副本——也就是说,数组里所有位置指向的都是同一个JSONObject对象,最后自然全是最后一次修改后的状态。
修正后的代码示例
把JSONObject的创建逻辑移到循环内部,每次循环都生成一个全新的实例,这样数组里的每个元素都是独立的对象:
private void setMesurement(Date[] ts, Integer[][] time, String mesurementLabel, Object[][] mesurementValue, Integer[][] unit ) { DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.FRENCH); JSONArray measurementArray = new JSONArray(); // 循环遍历每一组数据 for (int i = 0; i < ts.length; i++) { // 关键:每次循环都新建一个JSONObject,确保每个元素都是独立实例 JSONObject measurementObj = new JSONObject(); measurementObj.put("timestamp", dateFormat.format(ts[i])); measurementObj.put("time", time[i]); measurementObj.put("label", mesurementLabel); measurementObj.put("value", mesurementValue[i]); measurementObj.put("unit", unit[i]); // 将独立的对象添加到数组中 measurementArray.add(measurementObj); } // 这里可以继续处理生成的JSONArray,比如转成字符串或者传递给其他逻辑 // String jsonStr = JSONValue.toJSONString(measurementArray); }
核心要点
- 每次循环必须创建新的JSONObject实例,不能复用同一个对象
- JSONArray保存的是对象引用,而非对象副本,复用对象会导致所有数组元素指向同一个内存地址
- 这样修改后,数组里的每个JSONObject都会持有对应位置的独立数据,不会再出现重复覆盖的情况
内容的提问来源于stack exchange,提问作者Ahmed Garssallaoui
相关产品推荐
相关产品推荐

