【问题标题】:java convert map into a pojo when attribute names are different当属性名称不同时,java将map转换为pojo
【发布时间】:2018-09-28 13:31:05
【问题描述】:

属性名不同时是否可以将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 是一种静态类型语言,只是想知道有没有办法像 typescript 一样实现这一点,或者我们必须一直手动映射?

【问题讨论】:

    标签: java


    【解决方案1】:

    我们使用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());
    
    }
    

    【讨论】:

    • 非常感谢!!没想到这么简单!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 2013-05-01
    • 2017-03-22
    • 2016-02-02
    相关资源
    最近更新 更多