将链接哈希映射转换为复杂对象

2022-08-31 11:20:35

我有一个应用程序,它使用 Jackson 将一些数据存储在 DynamoDB 中,以将我的复杂对象编组为 JSON。

例如,我正在编组的对象可能如下所示:

private String aString;
private List<SomeObject> someObjectList;

某些对象可能如下所示:

private int anInteger;
private SomeOtherObject;

和 SomeOtherObject 可能如下所示:

private long aLong;
private float aFloat; 

这很好,因为对象被封送没有问题,并作为JSON字符串存储在数据库中。

当需要从 DynamoDB 检索数据时,Jackson 会自动检索 JSON 并将其转换回来...除了 “someObjectList” 作为 not as a 返回!这是杰克逊的标准行为,这不是一个错误。List<LinkedHashMap>List<SomeObject>

所以现在这导致了一个问题。我的代码库认为它处理一个,但现实是它处理一个!我的问题是,如何让我的LinkedHashMap回到“SomeObject”中。显然,这是一个手动过程,但我的意思是我甚至无法提取值。List<SomeObject>List<LinkedHashMap>

如果我这样做:

for (LinkedHashMap lhm : someObjectList) {
    // Convert the values back
}

我收到一个编译错误,告诉我某些ObjectList的类型是“SomeObject”而不是LinkedHashMap。

如果我这样做:

for (SomeObject lhm : someObjectList) {
    // Convert the values back
}

我收到一个运行时错误,告诉我LinkedHashMap不能被强制转换为“SomeObject”。


答案 1

您可以逐个值使用 ,甚至可以对整个列表使用 。但是您需要知道要转换为的类型:ObjectMapper.convertValue()

POJO pojo = mapper.convertValue(singleObject, POJO.class);
// or:
List<POJO> pojos = mapper.convertValue(listOfObjects, new TypeReference<List<POJO>>() { });

这在功能上与您执行的操作相同:

byte[] json = mapper.writeValueAsBytes(singleObject);
POJO pojo = mapper.readValue(json, POJO.class);

但避免将数据实际序列化为 JSON,而是使用内存中事件序列作为中间步骤。


答案 2

我有类似的问题,我们有包含值列表的GeneralResponse对象

 ResponseEntity<ResponseDTO> responseEntity = restTemplate.exchange(
                redisMatchedDriverUrl,
                HttpMethod.POST,
                requestEntity,
                ResponseDTO.class
        );

使用objectMapper有助于将LinkedHashMap转换为相应的DTO对象

 ObjectMapper mapper = new ObjectMapper();

 List<DriverLocationDTO> driverlocationsList = mapper.convertValue(responseDTO.getData(), new TypeReference<List<DriverLocationDTO>>() { });

推荐