Как избежать добавления повторяющихся записей в Jsonobject - PullRequest
0 голосов
/ 04 октября 2018

У меня есть следующий набор данных в базе данных Elasticsearch

"hits": [
      {
        "_index": "autotopology",
        "_type": "topologydata",
        "_id": "AWYum6htsO8xYxsN28QK",
        "_score": 0.47000363,
        "_source": {
          "host": "192.168.0.223",
          "os": "Linux",
          "services": [
            {
              "port": "80",
              "protocol": "tcp",
              "status": "open",
              "service": "http"
            },
            {
              "port": "2181",
              "protocol": "tcp",
              "status": "open",
              "service": "eforward"
            },
            {
              "port": "3000",
              "protocol": "tcp",
              "status": "open",
              "service": "ppp"
            },
            {
              "port": "3306",
              "protocol": "tcp",
              "status": "open",
              "service": "mysql"
            },
            {
              "port": "3340",
              "protocol": "tcp",
              "status": "open",
              "service": "anet-m"
            },
            {
              "port": "4567",
              "protocol": "tcp",
              "status": "open",
              "service": "tram"
            },
            {
              "port": "5601",
              "protocol": "tcp",
              "status": "open",
              "service": "esmagent"
            },
            {
              "port": "5665",
              "protocol": "tcp",
              "status": "open",
              "service": "unknown"
            },
            {
              "port": "5800",
              "protocol": "tcp",
              "status": "open",
              "service": "vnc-http"
            },
            {
              "port": "5900",
              "protocol": "tcp",
              "status": "open",
              "service": "vnc"
            },
            {
              "port": "6556",
              "protocol": "tcp",
              "status": "open",
              "service": "unknown"
            },
            {
              "port": "8009",
              "protocol": "tcp",
              "status": "open",
              "service": "ajp13"
            },
            {
              "port": "8080",
              "protocol": "tcp",
              "status": "open",
              "service": "http-proxy"
            },
            {
              "port": "8888",
              "protocol": "tcp",
              "status": "open",
              "service": "sun-answerbook"
            },
            {
              "port": "9200",
              "protocol": "tcp",
              "status": "open",
              "service": "wap-wsp"
            },
            {
              "port": "9300",
              "protocol": "tcp",
              "status": "open",
              "service": "vrace"
            },
            {
              "port": "10514",
              "protocol": "tcp",
              "status": "open",
              "service": "unknown"
            },
            {
              "port": "24224",
              "protocol": "tcp",
              "status": "open",
              "service": "unknown"
            },
            {
              "port": "27017",
              "protocol": "tcp",
              "status": "open",
              "service": "mongod"
            },
            {
              "port": "33556",
              "protocol": "tcp",
              "status": "open",
              "service": "unknown"
            }
          ],
          "time": 1538380216803,
          "customerID": "customer1234560000"
        }
      },
      {
        "_index": "autotopology",
        "_type": "topologydata",
        "_id": "AWY-hRMpVsmS0VCKavLL",
        "_score": 0.47000363,
        "_source": {
          "host": "192.168.0.223",
          "os": "Linux",
          "services": [
            {
              "port": "80",
              "protocol": "tcp",
              "status": "open",
              "service": "http"
            },
            {
              "port": "2181",
              "protocol": "tcp",
              "status": "open",
              "service": "eforward"
            },
            {
              "port": "2393",
              "protocol": "tcp",
              "status": "open",
              "service": "ms-olap1"
            },
            {
              "port": "3000",
              "protocol": "tcp",
              "status": "open",
              "service": "ppp"
            },
            {
              "port": "3306",
              "protocol": "tcp",
              "status": "open",
              "service": "mysql"
            },
            {
              "port": "4567",
              "protocol": "tcp",
              "status": "open",
              "service": "tram"
            },
            {
              "port": "5601",
              "protocol": "tcp",
              "status": "open",
              "service": "esmagent"
            },
            {
              "port": "5665",
              "protocol": "tcp",
              "status": "open",
              "service": "unknown"
            },
            {
              "port": "5800",
              "protocol": "tcp",
              "status": "open",
              "service": "vnc-http"
            },
            {
              "port": "5900",
              "protocol": "tcp",
              "status": "open",
              "service": "vnc"
            },
            {
              "port": "6556",
              "protocol": "tcp",
              "status": "open",
              "service": "unknown"
            },
            {
              "port": "8009",
              "protocol": "tcp",
              "status": "open",
              "service": "ajp13"
            },
            {
              "port": "8080",
              "protocol": "tcp",
              "status": "open",
              "service": "http-proxy"
            },
            {
              "port": "8888",
              "protocol": "tcp",
              "status": "open",
              "service": "sun-answerbook"
            },
            {
              "port": "9200",
              "protocol": "tcp",
              "status": "open",
              "service": "wap-wsp"
            },
            {
              "port": "9300",
              "protocol": "tcp",
              "status": "open",
              "service": "vrace"
            },
            {
              "port": "10514",
              "protocol": "tcp",
              "status": "open",
              "service": "unknown"
            },
            {
              "port": "24224",
              "protocol": "tcp",
              "status": "open",
              "service": "unknown"
            },
            {
              "port": "27017",
              "protocol": "tcp",
              "status": "open",
              "service": "mongod"
            },
            {
              "port": "33556",
              "protocol": "tcp",
              "status": "open",
              "service": "unknown"
            }
          ]

Как вы можете видеть в обоих документах, большинство значений повторяются, когда я получаю и анализирую эти данные, мне нужно пропустить добавление повторных сервисов в jsonobject..

На данный момент я сделал следующие вещи

           List<JSONObject>  serviceNodeList = new ArrayList<JSONObject>();
            JSONObject jsonObj = new JSONObject("read json data);
            JSONArray array = jsonObj.getJSONObject("hits").getJSONArray("hits");

            for (int i = 0; i < array.length(); i++) {

                JSONObject innerObj = array.getJSONObject(i);
                String host = innerObj.getJSONObject("_source").getString("host");
                JSONArray serviceList = innerObj.getJSONObject("_source").getJSONArray("services");

                for (int j = 0; j < serviceList.length(); j++) {
                    JSONObject serviceObject2 = new JSONObject();
                    JSONObject serviceObj = serviceList.getJSONObject(j);
                    String service = (String) serviceObj.get("service");
                    String port = serviceObj.getString("port");
                    String protocol = serviceObj.getString("protocol");


                        System.out.println(serviceObj.get("service"));
                        System.out.println("-----------");
                        list.add(obj);
                        serviceObject2.put("shape", "image");
                        serviceObject2.put("label", service);
                        File f = new File("images/" + service + ".png");
                        serviceObject2.put("image", "images/Circle-icon.png");
                        serviceObject2.put("widthMin", 15);
                        serviceObject2.put("widthMax", 15);
                        serviceObject2.put("x", 100);
                        serviceObject2.put("y", 100);
                        serviceObject2.put("title", "Server/Host: " + host + "\n" + "Port :" + port);
                        serviceObject2.put("value", 1);
                        serviceObject2.put("port", port);
                        serviceObject2.put("protocol", protocol);
                        serviceNodeList.add(serviceObject2);





                }



            }

здесь я не хочу добавлять повторяющиеся сервисы в jsonObject.

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Переопределив методы .equals () и toString () класса Object в вашем классе, вы можете достичь этого.

public class Test {
String service;

@Override
public String toString() {
    System.out.println("to string");
    return service;
}

@Override
public boolean equals(Object obj) {
    String name1 = (String) ((Test) obj).service;
    return service.equals(name1);
}
public static void main(String[] args) {
JSONArray array = jsonObj.getJSONObject("hits").getJSONArray("hits");
        List<Test> list = new ArrayList<Test>();
        for (int i = 0; i < array.length(); i++) {
            JSONObject innerObj = array.getJSONObject(i);
            String host = innerObj.getJSONObject("_source").getString("host");
            JSONArray serviceList = innerObj.getJSONObject("_source").getJSONArray("services");
            for (int j = 0; j < serviceList.length(); j++) {
                JSONObject serviceObject = new JSONObject();
                JSONObject serviceObj = serviceList.getJSONObject(j);
                Test test = new Test();
                test.service = serviceObj.getString("service");
                list.add(test);                   
                String service = (String) serviceObj.get("service");
                if (!list.contains(test)) {
                    System.out.println(serviceObj.get("service"));
                    System.out.println("-----------");
                    list.add(test);
                    serviceObject.put("service",service);
                    serviceNodeList.add(serviceObject2);
                }
            }
        }
        System.out.println(serviceNodeList);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return serviceNodeList;
}

, чтобы проверить, содержит ли список объект, который мы можем использовать .contains () класса списка, который внутренне вызывает .equals () , который внутренне вызывает toString ()

0 голосов
/ 04 октября 2018

Если я правильно понимаю, вы не хотите добавлять сервис, как показано ниже, потому что он дублируется для каждого хоста.

       {
          "port": "80",
          "protocol": "tcp",
          "status": "open",
          "service": "http"
        }

Вы можете взять java.util.HashSet и продолжать добавлять ключ (скажем,"http") в комплекте.Для каждой прочитанной услуги вы можете поставить чек,

List<JSONObject>  serviceNodeList = new ArrayList<JSONObject>();
JSONObject jsonObj = new JSONObject("read json data);
JSONArray array = jsonObj.getJSONObject("hits").getJSONArray("hits");

Set<String> keys = new HashSet<String>(); //Create hash set

for (int i = 0; i < array.length(); i++) {
    JSONObject innerObj = array.getJSONObject(i);
    String host = innerObj.getJSONObject("_source").getString("host");

    JSONArray serviceList = innerObj.getJSONObject("_source").getJSONArray("services");

    for (int j = 0; j < serviceList.length(); j++) {

        JSONObject serviceObj = serviceList.getJSONObject(j);
        String service = (String) serviceObj.get("service");
        String port = serviceObj.getString("port");
        String protocol = serviceObj.getString("protocol"); 

        if(!keys.contains(service)){ //Check key for existance in set so that you avoid duplicates service. You should create set key based on how you want to avoid duplicate
            JSONObject serviceObject2 = new JSONObject();

            System.out.println(serviceObj.get("service"));
            System.out.println("-----------");
            list.add(obj);
            serviceObject2.put("shape", "image");
            serviceObject2.put("label", service);
            File f = new File("images/" + service + ".png");
            serviceObject2.put("image", "images/Circle-icon.png");
            serviceObject2.put("widthMin", 15);
            serviceObject2.put("widthMax", 15);
            serviceObject2.put("x", 100);
            serviceObject2.put("y", 100);
            serviceObject2.put("title", "Server/Host: " + host + "\n" + "Port :" + port);
            serviceObject2.put("value", 1);
            serviceObject2.put("port", port);
            serviceObject2.put("protocol", protocol);
            serviceNodeList.add(serviceObject2);

            keys.add(service); //Add key to set
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...