首页 > 解决方案 > 添加到 Json 数组时数据被覆盖

问题描述

我有来自 Splunk 的数据,这些数据是带有端口的主机,有些主机有多个端口。所以我做了下面的逻辑。对于我添加到 jsonarray 的每个具有单个端口的主机。问题是端口总是在它添加到jsonarray的那一刻被覆盖我无法弄清楚为什么?

 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++) {
                JSONObject formDetailsJson = new JSONObject();
                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++)
                    {
                        formDetailsJson.put("host", list_of_OS_VulnerabilityOS.get(i).getDest());
                        formDetailsJson.put("port", list_of_OS_VulnerabilityOS.get(i).getList_of_ports().get(v)); // i got each time different port 
                        formDetailsJson.put("open", list_of_OS_VulnerabilityOS.get(i).isOpen());
                        formDetailsJson.put("info", list_of_OS_VulnerabilityOS.get(i).getInfo()); 
                        jsonArray.add(formDetailsJson); // here it overwrites to the first port again  
                        total_hostNumber_OS++;
                    }
                } else {
                    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;
    }```

标签: javajson

解决方案


 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++) {
            JSONObject formDetailsJson = null; // change #1
            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++)
                {
                    formDetailsJson = new JSONObject();  // change #2
                    formDetailsJson.put("host", list_of_OS_VulnerabilityOS.get(i).getDest());
                    formDetailsJson.put("port", list_of_OS_VulnerabilityOS.get(i).getList_of_ports().get(v)); // i got each time different port 
                    formDetailsJson.put("open", list_of_OS_VulnerabilityOS.get(i).isOpen());
                    formDetailsJson.put("info", list_of_OS_VulnerabilityOS.get(i).getInfo()); 
                    jsonArray.add(formDetailsJson); // here it overwrites to the first port again  
                    total_hostNumber_OS++;
                }
            } else {
                formDetailsJson = new JSONObject();  // change #3
                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;
}

在 #2 for 循环中,您使用的是相同的 formDetailsJson 对象。因此,每次循环运行时,您的 formDetailsJson 对象都会被覆盖。


推荐阅读