Jackson de / serialization by Key trouble

时间:2016-06-20 13:33:09

标签: java json jackson

我需要将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方法参数。因此,我需要从EntityEntityDTO以及EntityDTOEntity进行映射。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

杰克逊不会处理这样的转换,所以你需要自己进行转换。

你要求进行两次转换:

  1. 实体 - &gt; EntityDTO
  2. EntityDTO - &gt;实体
  3. 这些不是琐事改造,但它们也不是太糟糕。带有新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);