繁体   English   中英

如何在杰克逊中将带有实体继承的字段嵌入?

[英]How to embed field with entity inheritance in Jackson?

如果我有两个扩展抽象类的类:

public abstract class Vehicle {
    private String model;
}

public class Car extends Vehicle {
    private int seatingCapacity;
    private double topSpeed;
}

public class Truck extends Vehicle {
    private double payloadCapacity;
}

我想使用杰克逊(和spring-boot)序列化JSON中的数据。 默认情况下,JSON如下所示:

[
    {"model": "vw", "type": "car", "seatingCapacity": 5, ...},
    {"model": "volvo", "type": "truck", "payloadCapacity": 10, ...},
    ...
]

但是对于API,我需要将每个子类的特定字段包括在类类型中。

[
    {
     "model": "vw", 
     "type": "car", 
     "car": {"seatingCapacity": 5, ...}
    },
    {
     "model": "volvo", 
     "type": "truck", 
     "truck": {"payloadCapacity": 10, ...}
    },
    ...
]

这是一个奇怪的情况,因为默认的JSON实际上代表了你所定义他们的车辆。 我会说,如果只是用来代表被发送到修改类的东西,如响应这些对象的最简单的方法是:

public class Car extends Vehicle {
   CarProperties car=new CarProperties();

   class CarProperties {
      private int seatingCapacity;
      private double topSpeed;
   }
}

这可能不是很冷静寻找,但它将代表你想要的JSON。 此外,如果你没有在汽车类的代码,但只是定义属性也许你可以用一个getModel()方法的接口代替它。

另一个解决方案是编写自定义的串行杰克逊,但它将使代码更复杂和意志夫妇与它的对象。 或者,当然你也可以生成使用一些的JSONObject类和手动添加的属性,这些属性你自己的JSON。

如果需要,使用Jackson可以创建自定义解串器。 如果您可以创建与卡车和汽车相同的结构,那么我会首先尝试这样做,因为它更易于实现。 但除此之外,您可以创建如下内容:

public class VehicleDeserializer extends JsonDeserializer<Vehicle> { 

    @Override
    public Vehicle deserialize(JsonParser jp, DeserializationContext ctxt) 
      throws IOException, JsonProcessingException {
        JsonNode node = jp.getCodec().readTree(jp);

        String vehicleType = node.get("type").asText();

        if (vehicleType.equals("car")) {
            // Values should be loaded through node
            return new Car();
        }

        if (vehicleType.equals("truck")) {
            // Values should be loaded through node
            return new Truck();
        }

        // Return default or exception if not recognized
    }
}

而且必须更新ObjectMapper

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(Vehicle.class, new VehicleDeserializer());
mapper.registerModule(module);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM