84

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

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

private String aString;
private List<SomeObject> someObjectList;

SomeObject 可能看起来像这样:

private int anInteger;
private SomeOtherObject;

SomeOtherObject 可能如下所示:

private long aLong;
private float aFloat; 

这很好,对象可以毫无问题地编组并作为 JSON 字符串存储在数据库中。

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

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

如果我这样做:

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

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

如果我这样做:

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

我收到一个运行时错误,告诉我无法将 LinkedHashMap 强制转换为“SomeObject”。

4

3 回答 3

204

您可以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,而是使用内存中的事件序列作为中间步骤。

于 2013-03-16T18:42:12.503 回答
8

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

 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>>() { });
于 2019-07-16T20:41:19.573 回答
0

这个问题有一个很好的解决方案:

import com.fasterxml.jackson.databind.ObjectMapper;

ObjectMapper objectMapper = new ObjectMapper();

***DTO premierDriverInfoDTO = objectMapper.convertValue(jsonString, ***DTO.class); 

Map<String, String> map = objectMapper.convertValue(jsonString, Map.class);

为什么会出现这个问题?我猜你在将字符串转换为对象时没有指定具体的类型,对象是一个泛型类型的类,比如User<T>。

也许还有另一种解决方法,使用 Gson 而不是 ObjectMapper。(或参见此处使用 GSON 反序列化通用类型

Gson gson = new GsonBuilder().create();

Type type = new TypeToken<BaseResponseDTO<List<PaymentSummaryDTO>>>(){}.getType();

BaseResponseDTO<List<PaymentSummaryDTO>> results = gson.fromJson(jsonString, type);

BigDecimal revenue = results.getResult().get(0).getRevenue();
于 2019-03-20T09:15:10.460 回答