У меня есть следующий набор данных в базе данных 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.
Какую библиотеку вы используете для JSONObject? Реализует ли этот класс equals и hashCode? Если это так, тогда просто используйте Set вместо List как serviceNodeList.
Библиотека @Seigil Bishyr, используемая для JSONObject, - это org.json, я знаю, что если я использую Set, она не будет допускать дублирования, но каждый раз, когда мне нужно помещать данные в JSONObject, я должен знать, что служба повторяется.




Если я правильно понимаю, вы не хотите добавлять сервис, как показано ниже, потому что они дублируются для каждого хоста.
{
"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
}
}
}
Вы можете добиться этого, переопределив методы .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;
}
чтобы проверить, содержит ли список объект, мы можем использовать .содержит() класса list, который внутренне вызывает .equals (), который внутренне вызывает нанизывать()
Спасибо за ваше время, я попробую и дам вам знать.
Не конвертируете объект Json в какой-либо объект Java? Если вы конвертируете в объект java и добавляете элементы услуг в список. удалить дубликаты можно по ссылке stackoverflow.com/questions/29670116/…