Разбор JSON в Java по имени ключа - PullRequest
0 голосов
/ 12 декабря 2018

Я не нашел ни одной темы по той же проблеме.Поправьте меня, если я ошибаюсь.

Следующий JSON - это упрощенная версия ответа, который я получаю от внешнего API:

{    
    "vehicles": [
        {
            "car": {
                "color": "blue",
                "brand": "audi",
                "maxSpeed": 300,
                "releaseYear": 2016 
            }
        },
        {
            "car": {
                "color": "red",
                "brand": "bmw",
                "maxSpeed": 200,
                "releaseYear": 2012 
            }
        },
        {
            "motorcycle": {
                "color": "yellow",
                "brand": "yamaha",
                "maxSpeed": 300,
                "releaseYear": 2013 
            }
        }
    ]
}

Итак, я получаю список транспортных средств и каждого элементаэто объект, который имеет одно поле с именем либо автомобиль или мотоцикл, другие варианты невозможны.Оба типа транспортных средств имеют одинаковые поля данных.Единственный способ различить оба типа - по имени ключа в JSON

Как я хочу его проанализировать:

В Java у меня есть три объекта:

abstract class Vehicle {
    String color;
    String brand;
    Integer maxSpeed;
    Integer releaseYear

    public boolean hasFourWheels();
}

class Car extends Vehicle {
    public boolean hasFourWheels() { return true; }
}

class Motorcycle extends Vehicle {
    public boolean hasFourWheels() { return false; }
}

Можно ли получить список транспортных средств, где каждый экземпляр - автомобиль или мотоцикл?

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Очень похоже на то, что вы спрашиваете: один суперкласс и несколько подклассов.Используйте @JsonTypeInfo аннотацию: https://www.baeldung.com/jackson-inheritance

0 голосов
/ 12 декабря 2018

Да, это возможно.

В случае, если вам нужно что-то вроде getCarList и getMotorCycleList, которые возвращают вам список автомобилей и список мотоциклов соответственно после анализа json:

  • Анализ JSON с помощью com.google.gson.JsonParser
  • Затем получите JsonArray, используя в качестве имени свойства «Vehicles».
  • Выполните итерацию по массиву и проверьте, есть ли в элементе массива элемент с именем «car».Соответственно создайте экземпляр автомобиля или мотоцикла, заполните атрибуты и добавьте его в соответствующий список автомобиля или мотоцикла.

Дайте мне знать, если необходимо добавить фрагмент кода.

0 голосов
/ 12 декабря 2018

Решение, которое я попробовал, заключается в использовании промежуточного класса, который отображает больше в структуру json:

import java.util.ArrayList;
import java.util.List;

import cars.Car;
import cars.Motorcycle;
import cars.Vehicle;


public class VehiclesHolder {

    List<VehicleHolder> vehicles=new ArrayList<>();

    public static class VehicleHolder {
        Car car;
        Motorcycle motorcycle;
        public Car getCar() {
            return car;
        }
        public void setCar(Car car) {
            this.car = car;
        }
        public Motorcycle getMotorcycle() {
            return motorcycle;
        }
        public void setMotorcycle(Motorcycle motorcycle) {
            this.motorcycle = motorcycle;
        }
    }

    public List<VehicleHolder> getVehiclesHolder() {
        return vehicles;
    }

    public void setVehiclesHolder(List<VehicleHolder> vehicles) {
        this.vehicles = vehicles;
    }
    public List<Vehicle> getVehicles()
    {
        List<Vehicle> result=new ArrayList<Vehicle>();
        for(VehicleHolder holder:vehicles)
        {
            result.add(holder.getCar()!=null?holder.getCar():holder.getMotorcycle());
        }
        return result;
    }
}

Используйте Jackson ObjectMapper для анализа json этого класса:

import java.io.IOException;
import java.util.List;
import cars.Vehicle;
import com.fasterxml.jackson.databind.ObjectMapper;

public class ParserMain {

    public static void main(String[] args) throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        VehiclesHolder holder=objectMapper.readValue(ParserMain.class.getResourceAsStream("input.json"), VehiclesHolder.class);
        List<Vehicle> vehicles=holder.getVehicles();
    }
}

Транспортные средствапеременная в конце содержит список экземпляров Car и Motorcycle.

Метод ObjectMapper.readValue существует в различных вариантах.

Последнее: используемые зависимости maven:

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.5.3</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.5.3</version>
    </dependency>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...