代码之家  ›  专栏  ›  技术社区  ›  Pratap A.K

当属性名不同时,java将map转换为pojo

  •  1
  • Pratap A.K  · 技术社区  · 6 年前

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

    我正在将原始输入提取到地图中,以获得以下数据。数据可能因消息类型而异。例如:

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

    对于消息类型=非标准

    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;
    }
    

    StandardMessage sm = new StandardMessage();
    sm.setLongitude(data.get('GPSLON'));
    
    NonStandardMessage nsm = new NonStandardMessage();
    nsm.setTemperature(data.get('TEMP'));
    

    有没有可能使上述映射通用?i、 在不知道名称的情况下设置对象属性?

    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那样实现这一点,或者我们必须一直手动映射?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Leon    6 年前

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