简体   繁体   English

将 Jackson Pojo 转换为不同的 Jackson Pojo

[英]Convert Jackson Pojo to Different Jackson Pojo

I have an input that is a Jackson PoJo and I need to convert it to a different Jackson Pojo.我有一个输入是 Jackson Pojo,我需要将其转换为不同的 Jackson Pojo。 All examples I am finding are from Json -> Pojo and Pojo -> Json.我找到的所有示例都来自 Json -> Pojo 和 Pojo -> Json。 Is creating a custom serializer the way to convert from one Pojo to another?创建自定义序列化程序是从一个 Pojo 转换为另一个 Pojo 的方式吗?

If the field names match, or have aliases defined, you could simply serialize one object and deserialize into the other;如果字段名称匹配,或者定义了别名,您可以简单地序列化一个 object 并反序列化到另一个; eg例如

objectMapper.readValue(objectMapper.writeValueAsBytes(object1), Object2.class)

If the fields don't align one-to-one, there isn't a direct way如果字段没有一对一对齐,则没有直接的方法

Therefore, you have some other options因此,您还有其他一些选择

  • Copy constructor / Factory method: new Object2(object1) or Object2.from(object1)复制构造函数/工厂方法: new Object2(object1)Object2.from(object1)
  • Builder / setter: object2.setX(object1.getX()); // repeat for all fields生成器/设置器: object2.setX(object1.getX()); // repeat for all fields object2.setX(object1.getX()); // repeat for all fields
  • Use a library like ModelMapper (effectively the same as options above)使用像ModelMapper这样的库(实际上与上面的选项相同)
  • Use reflection (very brittle and only to be used if you don't have access to modify either class)使用反射(非常脆弱,只有在您无权修改任何一个类时才使用)

ModelMapper, like OneCricketeer said, or MapStruct can do the job of mapping one POJO to another POJO. ModelMapper,就像 OneCricketeer 所说的那样,或者MapStruct可以完成将一个 POJO 映射到另一个 POJO 的工作。

You can use MapStruct like below:您可以使用MapStruct ,如下所示:

  1. Add MapStruct dependency:添加MapStruct依赖:

     <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.4.2.Final</version> </dependency>

Example-例子-

Car.java汽车.java

public class Car {
    private String make;
    private int seatCount;
    private CarType type;
    //constructor, getters, setters etc.
}

CarDto.java CarDto.java

public class CarDto {
    private String make;
    private int seatCount;
    private String type;
    //constructor, getters, setters etc.
}

CarMapper.java CarMapper.java

@Mapper
public interface CarMapper {
 
    CarMapper INSTANCE = Mappers.getMapper( CarMapper.class );
    CarDto carToCarDto(Car car);
    Car carDtoToCar(CarDto carDto);
}

Use:利用:

public void shouldMapCarToDto() {

    Car car = new Car( "Morris", 5, CarType.SEDAN );
    // mapping Car to carDto
    CarDto carDto = CarMapper.INSTANCE.carToCarDto(car);
}

For more details-> MapStruct更多细节-> MapStruct

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

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