我需要将Entity
de /序列化为EntityDTO
。问题是Entity
类有collection<KeyValue>
其中:
class KeyValueDTO {
private String key;
private Object value;
}
和Entity
包含KeyValue
:
class KeyValue {
private String key;
private Object[] values;
}
因此,在每种情况下数据的存储方式略有不同。所以,
KeyValueDTO dto1 = new KeyValueDTO("k1", "v1");
KeyValueDTO dto2 = new KeyValueDTO("k1", "v2");
KeyValueDTO dto3 = new KeyValueDTO("k1", "v3");
并使用KeyValue
类:
KeyValue values = new KeyValue("k1", new Object[] { "v1", "v2", "v3"});
然后,Entity
类是
class Entity {
List<KeyValue> values;
}
和
class EntityDTO {
List<KeyValueDTO> values;
}
我需要映射一个json,如:
[ {"k1": "v1"}, {"k1": "v2"}, {"k1": "v3"} ]
到List<KeyValue>
。因此,values
属性必须包含一个元素KeyValue::key => "k1"
和KeyValue::values => {"v1", "v2", "v3"}
。
我正在使用jackson来取消/序列化每个REST方法参数。因此,我需要从Entity
到EntityDTO
以及EntityDTO
到Entity
进行映射。
有什么想法吗?
答案 0 :(得分:1)
杰克逊不会处理这样的转换,所以你需要自己进行转换。
你要求进行两次转换:
这些不是琐事改造,但它们也不是太糟糕。带有新Streams API的Java 8非常适合这些类型的转换。
你走了:
Entity entityToTransform = new Entity();
EntityDTO entityDtoToTransform = new EntityDTO();
// Entity -> EntityDTO
// transform the list of KeyValues to KeyValueDTOs
List<KeyValueDTO> keyValueDtos = entityToTransform.getValues().stream(
).flatMap(
keyValue -> Arrays.stream(
keyValue.getValues()
).map(
value -> new KeyValueDTO(keyValue.getKey(), value)
)
).collect(Collectors.toList());
// set the object
EntityDTO entityDto = new EntityDTO(keyValueDtos);
// EntityDTO -> Entity
// transforms the list of KeyValueDTOs to KeyValues
List<KeyValue> keyValues = entityDtoToTransform.getValues().stream(
).collect(
Collectors.collectingAndThen(
Collectors.groupingBy(keyValueDto -> keyValueDto.getKey()),
groupings -> groupings.entrySet().stream(
).map(
entry -> new KeyValue(
entry.getKey(),
entry.getValue().stream(
).map(
keyValueDto -> keyValueDto.getValue()
).collect(
Collectors.toList()
).toArray(
new Object[entry.getValue().size()]
)
)
).collect(Collectors.toList())
)
);
Entity entity = new Entity(keyValues);