我有一个应用程序,它使用 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”返回为 List<LinkedHashMap>
而不是 List<SomeObject>
!这是杰克逊的标准行为,这不是一个错误。
所以现在这导致了一个问题。我的代码库认为它处理的是 List<SomeObject>
但实际情况是它处理的是 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”。
原文由 tarka 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以使用
ObjectMapper.convertValue()
逐个值甚至整个列表。但是您需要知道要转换为的类型:这在功能上与您所做的相同:
但避免将数据实际序列化为 JSON,而是使用内存中的事件序列作为中间步骤。