You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:04:36