如何将地图转换为DTO

问题描述 投票:0回答:1

如果有谁知道更好的算法来解析和映射。非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个回答
0
投票

你可以使用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;
}

0
投票

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

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.