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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:34:23