java - 在Java中通过键名解析JSON

标签 java json rest parsing jackson

我没有找到任何关于同一问题的主题。如果我错了请纠正我。

以下 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; }
}

是否可以获得每个实例都是汽车或摩托车的车辆列表?

最佳答案

我尝试的解决方案是使用中间类,它将更多内容映射到 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();
    }
}

最后的车辆变量包含汽车和摩托车实例的列表。

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>

关于java - 在Java中通过键名解析JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53742364/

相关文章:

sql - 转义 JSON 输出的特殊字符

java - -xms 总和大于主机 RAM 的多个 JVM

c# - 如何反序列化以日期为键的复杂 JSON C#

java - 在 Java 中格式化 JSON 数据

java - 使用自定义 View 解析器和自定义 View 的 Spring MVC AJAX 和 JSON

c# - 通过 REST 发送大量数据 - 最佳实践

java - 使用 Google OAuth2 以编程方式登录网站

rest - 如何在 go-restful 中绑定(bind)处理程序?

java - JmonkeyEngine gradlew 构建不起作用

java - 使用 boolean 方法