应用程序可以接收包含动态类型字段的JSON:布尔值,数字,字符串,日期。
是否有任何现成的解决方案/库可将此字段映射到专用于特定类型的Java对象字段:Boolean
,Long
,Double
,String
, Instant
?
我可以看到的一种解决方案:
1)将此字段作为DTO中Object
类型的字段接收;
2)通过使用instanceOf
表达式检查其类型,将其映射到专用字段。
最终对象应具有以下结构:
public class PropertyValue {
private Boolean booleanValue;
private Long longValue;
private Double doubleValue;
private String keywordValue;
private Instant dateValue;
}
请求:
public class Request {
private Object value;
}
映射器:
public interface DynamicMapper {
// TODO: provide implementation
PropertyValue mapToPropertyValue(Request request);
}
一些测试以了解预期结果:
@Test
void mapFloat() {
Float value = 11.23f;
Request request = new Request(value);
PropertyValue propertyValue = mapper.mapToPropertyValue(request);
assertEquals(value, propertyValue.getDoubleValue());
assertNull(propertyValue.getLongValue());
assertNull(propertyValue.getBooleanValue());
assertNull(propertyValue.getKeywordValue());
assertNull(propertyValue.getDateValue());
}
@Test
void mapString() {
String value = "String";
Request request = new Request(value);
PropertyValue propertyValue = mapper.mapToPropertyValue(request);
assertEquals(value, propertyValue.getKeywordValue());
}
@Test
void mapInstant() {
Instant value = Instant.now();
Request request = new Request(value);
PropertyValue propertyValue = mapper.mapToPropertyValue(request);
assertEquals(value, propertyValue.getDateValue());
}