我没有找到任何关于同一问题的主题。如果我错了请纠正我。
以下 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/