Как проанализировать вложенный файл json, если существует много полей второго уровня? - PullRequest
3 голосов
/ 10 февраля 2020

Я пытаюсь проанализировать файл json с помощью gson, и я нашел несколько решений. Но моя проблема в том, что у меня есть много полей? на самом деле записать их всех в классе. Как я могу получить информацию внутри авто + цвет, не создавая класс с name1 - name564? Вот пример json: ´

{"test":
    {"Name1":
        {"number":"123",
        "color":"red",
        "cars":{"BMW":1,
            "PORSCHE":2,
            "MERCEDES":4,
            "FORD":6}
        },
    .
    .
    .
    .
    .
    .
    "Name564":
        {"number":"143",
        "color":"blue",
        "cars":{"BMW":9,
                "PORSCHE":2,
                "MERCEDES":3,
                "FORD":7}
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 10 февраля 2020

Вы можете использовать Map для отображений. Вот код для разбора вашего примера:

class JsonRoot {
    Map<String, JsonName> test;
}

class JsonName {
    String number;
    String color;
    Map<String, Integer> cars;
}

...
JsonRoot jsonRoot;
Gson gson = new Gson();
try (BufferedReader reader = Files.newBufferedReader(Paths.get("test.json"))) {
    jsonRoot = gson.fromJson(reader, JsonRoot.class);
}
1 голос
/ 10 февраля 2020

Я не уверен, что у меня точно возникла проблема, но если я это сделаю, решением может быть создание нового класса Java с именем say MyClass. MyClass будет иметь Name1, ..., Name564 в качестве экземпляров, а число, цвет, автомобили - в качестве атрибутов, например:

class MyClass {
    private String name;
    private int number; //use int or String if you prefer
    private String color; //you can also use enum instead
    private Map<String, Integer> cars;

    public MyClass(String name) {
        this.name = name;
        cars = new HashMap<>(); // or any other map implementation, depending on the needs
    }

    public void addCar(String model, int numCars) {
        cars.put(model, numCars); // if you always want to replace, add any necessary checks before that
    }

    //or you can use setCars, seeing test.get("cars") as Map
    public void setCars(Map<String,Integer> cars) {
        this.cars = cars;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public void setColor(String color) {
        this.color = color;
    }
}

Затем, когда вы выполняете итерацию json do c, вы можете установите поле, с которым вы столкнетесь. Для каждого элемента «Имя», с которым вы встречаетесь, вы можете создать новый экземпляр MyClass: MyClass currItem = new MyClass("Name"+counter), где counter - это счетчик, который вы инициализируете от 1 до размера дочернего элемента «тестового» элемента.

doc.get("test").get("Name"+counter) даст вам следующий предмет. Вы можете использовать .get("color"), .get("number") и .get("cars") для соответствующих полей.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...