Splunk主机端口数据转JSON时端口被覆盖问题排查求助
问题根源:重复使用同一个JSONObject实例
你遇到的端口被覆盖问题,核心原因是在多端口循环中复用了同一个JSONObject对象。JSONArray中存储的是对象的引用,而非对象的副本——当你反复修改同一个formDetailsJson的port属性并添加到数组时,数组里的所有条目其实都指向同一个对象,最终所有条目都会显示最后一次循环设置的端口值。
修复方案:在端口循环内新建JSONObject
只需要把JSONObject formDetailsJson = new JSONObject();的创建逻辑移到内部的端口循环中,让每个端口都对应一个独立的JSONObject实例,就能解决覆盖问题。
修改后的完整代码
public JSONObject parse_OS_Vuln_data_to_Json() { JSONObject responseDetailsJson = new JSONObject(); JSONArray jsonArray = new JSONArray(); if (list_of_OS_VulnerabilityOS.size() > 0) { for (int i = 0; i < list_of_OS_VulnerabilityOS.size(); i++) { if (list_of_OS_VulnerabilityOS.get(i).getList_of_ports().size() > 1) { for (int v = 0; v < list_of_OS_VulnerabilityOS.get(i).getList_of_ports().size(); v++) { // 关键:每次循环端口时新建一个JSONObject JSONObject formDetailsJson = new JSONObject(); formDetailsJson.put("host", list_of_OS_VulnerabilityOS.get(i).getDest()); formDetailsJson.put("port", list_of_OS_VulnerabilityOS.get(i).getList_of_ports().get(v)); formDetailsJson.put("open", list_of_OS_VulnerabilityOS.get(i).isOpen()); formDetailsJson.put("info", list_of_OS_VulnerabilityOS.get(i).getInfo()); jsonArray.add(formDetailsJson); total_hostNumber_OS++; } } else { JSONObject formDetailsJson = new JSONObject(); formDetailsJson.put("host", list_of_OS_VulnerabilityOS.get(i).getDest()); formDetailsJson.put("port", list_of_OS_VulnerabilityOS.get(i).getPorts___port()); formDetailsJson.put("open", list_of_OS_VulnerabilityOS.get(i).isOpen()); formDetailsJson.put("info", list_of_OS_VulnerabilityOS.get(i).getInfo()); jsonArray.add(formDetailsJson); total_hostNumber_OS++; } } responseDetailsJson.put("data", jsonArray); System.out.print("\n list size: " + list_of_OS_VulnerabilityOS.size()); System.out.print("\n total of OS-host to be send : " + total_hostNumber_OS); } return responseDetailsJson; }
额外优化建议
为了减少代码重复,你可以把构建单条主机端口JSON的逻辑抽成一个独立方法,让代码更简洁易维护:
private JSONObject buildHostPortJson(String host, String port, boolean isOpen, String info) { JSONObject json = new JSONObject(); json.put("host", host); json.put("port", port); json.put("open", isOpen); json.put("info", info); return json; }
之后在原方法中直接调用这个方法即可:
// 多端口循环内 jsonArray.add(buildHostPortJson( list_of_OS_VulnerabilityOS.get(i).getDest(), list_of_OS_VulnerabilityOS.get(i).getList_of_ports().get(v), list_of_OS_VulnerabilityOS.get(i).isOpen(), list_of_OS_VulnerabilityOS.get(i).getInfo() )); // 单端口逻辑内 jsonArray.add(buildHostPortJson( list_of_OS_VulnerabilityOS.get(i).getDest(), list_of_OS_VulnerabilityOS.get(i).getPorts___port(), list_of_OS_VulnerabilityOS.get(i).isOpen(), list_of_OS_VulnerabilityOS.get(i).getInfo() ));
内容的提问来源于stack exchange,提问作者ikenahim
相关产品推荐
相关产品推荐

