Если вы уже используете Jackson
, хорошо создать POJO
и десериализовать JSON
полезную нагрузку для данной POJO
структуры.Ваши классы могут выглядеть следующим образом:
class Nations {
private List<Nation> nations;
private Map<Integer, List<Integer>> neighbouring;
public List<Nation> getNations() {
return nations;
}
public void setNations(List<Nation> nations) {
this.nations = nations;
}
public Map<Integer, List<Integer>> getNeighbouring() {
return neighbouring;
}
public void setNeighbouring(Map<Integer, List<Integer>> neighbouring) {
this.neighbouring = neighbouring;
}
@Override
public String toString() {
return "Nations{" +
"nations=" + nations +
", neighbouring=" + neighbouring +
'}';
}
}
class Nation {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Nation{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
Теперь, когда у нас есть модель, мы можем попытаться проанализировать и распечатать соседей для каждой страны:
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class JsonApp {
public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();
ObjectMapper mapper = new ObjectMapper();
Nations nations = mapper.readValue(jsonFile, Nations.class);
// To make lookup fast create map id -> name
Map<Integer, String> id2Name = new HashMap<>();
nations.getNations().forEach(nation -> id2Name.put(nation.getId(), nation.getName()));
Map<Integer, List<Integer>> neighbouring = nations.getNeighbouring();
nations.getNations().forEach(nation -> {
List<String> neighbours = neighbouring.get(nation.getId())
.stream().map(id2Name::get).collect(Collectors.toList());
System.out.println(nation.getName() + " => " + neighbours);
});
}
}
Над отпечатками кода:
Russia => [Ukraine]
Poland => [Ukraine]
Ukraine => [Russia, Poland]
Для получения дополнительной информации читайте:
РЕДАКТИРОВАТЬ
Ваша модель после изменения JSON
может выглядеть следующим образом:
abstract class Area {
protected int id;
protected String name;
protected int population;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPopulation() {
return population;
}
public void setPopulation(int population) {
this.population = population;
}
}
class Nation extends Area {
private List<City> cities;
public List<City> getCities() {
return cities;
}
public void setCities(List<City> cities) {
this.cities = cities;
}
@Override
public String toString() {
return "Nation{" +
"id=" + id +
", name='" + name + '\'' +
", population=" + population +
", cities=" + cities +
'}';
}
}
class City extends Area {
@Override
public String toString() {
return "City{" +
"id=" + id +
", name='" + name + '\'' +
", population=" + population +
'}';
}
}