парсинг данных JSON в Java - застрял с идентификаторами - PullRequest
0 голосов
/ 03 марта 2019

У меня есть следующие JSON данные с массивом nations.

Neighbouring в файле данных JSON указывает, какие нации имеют соседей с другими нациями. id нации относится к соседним нациям id .

т.е.Россия имеет Украину рядом с ней, Польша имеет Украину, а Украина имеет Польшу и Россию рядом с ней и т. Д.

- все данные уже импортированы с Jackson

Как я могу перечислить соседниенации для каждой нации?то есть.Как я могу указать, что Украина имеет Россию и Польшу в качестве соседей?

{
  "nations" : [{
      "id" : 1,
      "name" : "Russia",
      "population" : 1000000000,
      "cities" : [{
          "id" : 222,
          "name" : "Moscow",
          "population": 4884333
      },{
          "id" : 223,
          "name" : "Kazan",
          "population": 799343
      }]
  },{

Я думаю, я мог бы вернуть массив [3] с этой строкой:

JSONArray array = value.getJSONObject("neighbouring").getJSONArray("1");

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

1 Ответ

0 голосов
/ 03 марта 2019

Если вы уже используете 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 +
                '}';
    }
}
...