【问题标题】:How to convert map into DTO如何将地图转换为 DTO
【发布时间】:2023-03-10 17:43:01
【问题描述】:

如果有人知道更好的算法来解析和映射 NOT JSON 字符串到 DTO 而不是这个?

@Getter
@Setter
public class SensorDataDTO {
    private String serial;
    private Double moisture;
    private Integer humidity;
}

SensorDataDTO parseAndMapSensorData(String rawMessage) {
//  bad message = "Sensor Connected!";
//  or message can be like this "serial=AA12;moisture=3,14;";
//  or "serial=AA12;moisture=3,14;humidity=75;";
//  or completely different.
        if (rawMessage.contains(";")) {
            SensorDataDTO sensorDataDTO = new SensorDataDTO();
            Map<String, String> mapMessage = Splitter.on(';')
                .omitEmptyStrings()
                .trimResults()
                .withKeyValueSeparator(
                    Splitter.on('=')
                        .limit(2)
                        .trimResults())
                .split(rawMessage);
            for (Map.Entry<String, String> entry : mapMessage.entrySet()) {
                if (serial.equals(entry.getKey()))
                    sensorDataDTO.setSerial(entry.getValue());
                if (secondKey.equals(entry.getKey()))
                    sensorDataDTO.setMoisture(Double.parseDouble(entry.getValue()));
                if (thirdKey.equals(entry.getKey()))
                    sensorDataDTO.setHumidity(Integer.parseInt(entry.getValue()));
            }
            return sensorDataDTO;
        }
        return null;
    }

我很欣赏所有类型的信息,但没有兴趣为这种情况添加一些特定的库或依赖项。

【问题讨论】:

    标签: java parsing dto


    【解决方案1】:

    可以使用Java的反射机制。

    public SensorDataDTO parseAndMapSensorData() {
        SensorDataDTO sensorDataDTO = new SensorDataDTO();
        Map<String, Object> mapMessage = new HashMap<>();
        mapMessage.put("serial", "AA12");
        mapMessage.put("moisture", 3.14);
        mapMessage.put("humidity", 75);
    
        //conver map to javabean
        Field[] f = sensorDataDTO.getClass().getDeclaredFields();
        for (int i = 0; i < f.length; i++) {
            f[i].setAccessible(true);
            try {
                Object value = mapMessage.get(f[i].getName());
                f[i].set(sensorDataDTO, value);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return sensorDataDTO;
    }
    

    【讨论】:

      【解决方案2】:

      我更喜欢这个算法,因为它没有任何多余的循环。

      SensorDataDTO parseAndMapSensorData(String rawMessage) {
              if (rawMessage.contains(";")) {
                  SensorDataDTO sensorDataDTO = new SensorDataDTO();
                  Map<String, String> mapMessage = Splitter.on(';')
                      .omitEmptyStrings()
                      .trimResults()
                      .withKeyValueSeparator(
                          Splitter.on('=')
                              .limit(2)
                              .trimResults())
                      .split(rawMessage);
                  sensorDataDTO.setSerial(parse(mapMessage, serial));
                  sensorDataDTO.setMoisture(parseInt(parse(mapMessage, secondKey)));
                  sensorDataDTO.setHumidity(parseDouble(parse(mapMessage, thirdKey)));
                  return sensorDataDTO;
              }
              return null;
          }
      
        public static String parse(Map<String, String> mapMessage, String key) {
              try {
                  return String.valueOf(mapMessage.get(key));
              } catch (Exception e) {
                  return null;
              }
          }
      
      @Getter
      @Setter
      public class SensorDataDTO {
          private String serial;
          private Double moisture;
          private Integer humidity;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-08
        相关资源
        最近更新 更多