当属性名称不同时,Java将映射转换为pojo

时间:2018-09-28 04:33:57

标签: java

属性名称不同时是否可以将map转换为pojo?

我正在将原始输入提取到地图中以包含以下数据。数据可以根据消息类型而变化。例如:

对于消息类型=标准

Map<String, Double> data = new HashMap<>();
data.set('TEMP', 18.33);
data.set('BTNUM', 123);

对于消息类型= NON_STANDARD

Map<String, Double> data = new HashMap<>();
data.set('GPSLAT', 12.33);
data.set('GPSLON', 42.33);

对于每种消息类型,我都有一个Java模型类

@Data
public class StandardMessage {
  private String longitude;
  private String latitude;
}

@Data
public class NonStandardMessage {
  private String temperature;
  private String btNumber;
}

目前,我正在手动将数据映射到POJO类,如下所示

StandardMessage sm = new StandardMessage();
sm.setLongitude(data.get('GPSLON'));

NonStandardMessage nsm = new NonStandardMessage();
nsm.setTemperature(data.get('TEMP'));

是否可以使上述映射通用?即在不知道名称的情况下设置对象属性?

在Typescript中,我们可以通过定义如下配置轻松实现此目的:

objectPropertyMapping = new Map();
objectPropertyMapping.set('GPSLAT', 'latitude');
objectPropertyMapping.set('GPSLON', 'longitude');

standardMessage = {};
data.forEach((value: boolean, key: string) => {
    standardMessage[ObjectPropertyMapping.get(key)] = data[key];
});

https://stackblitz.com/edit/angular-zjn1kc?file=src%2Fapp%2Fapp.component.ts

我知道Java是一种静态类型的语言,只是想知道是否有一种方法可以像打字稿一样实现这一目标,或者我们必须一直手动进行映射?

1 个答案:

答案 0 :(得分:3)

我们使用jackson-databind。它使用注释进行配置。

以下是一些示例:

实体类:

class MessageRequest {

    @JsonProperty("A")
    private String title;
    @JsonProperty("B")
    private String body;

    ... getters and setters ...
}

主要方法:

public static void main(String[] args) {
    ObjectMapper objectMapper = new ObjectMapper();
    Map<String, Object> source = new HashMap<>();
    source.put("A", "This is the title");
    source.put("B", "Here is the body");


    MessageRequest req = objectMapper.convertValue(source, MessageRequest.class);

    System.out.println(req.getTitle());
    System.out.println(req.getBody());

}