如果有谁知道更好的算法来解析和映射。非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的反射机制。
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;
}
我更喜欢这种算法,因为它没有任何冗余的循环。
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;
}