如何将一个动态类型的json字段映射到具体类型的对象字段?

时间:2019-07-17 13:12:03

标签: java json

应用程序可以接收包含动态类型字段的JSON:布尔值,数字,字符串,日期。 是否有任何现成的解决方案/库可将此字段映射到专用于特定类型的Java对象字段:BooleanLongDoubleStringInstant

我可以看到的一种解决方案:

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

0 个答案:

没有答案