我有一个在DynamoDB中存储一些数据的应用程序,它使用Jackson将复杂对象编组到JSON中。
例如,我正在编组的对象可能如下所示:
private String aString;
private List<SomeObject> someObjectList;
其中SomeObject可能如下所示:
private int anInteger;
private SomeOtherObject;
和SomeOtherObject可能如下所示:
private long aLong;
private float aFloat;
这是很好的,对象得到编组没有问题,并存储在DB中作为JSON字符串。
当需要从DynamoDB检索数据时,Jackson会自动检索JSON并将其转换回来......除了“someObjectList”作为List<LinkedHashMap>
而不是List<SomeObject>
返回!这是Jackson的标准行为,发生这种情况并不是错误。
所以现在这就导致了一个问题。我的代码库认为它在处理一个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”。
6条答案
按热度按时间t1qtbnec1#
你可以使用
ObjectMapper.convertValue()
,可以逐个值使用,也可以对整个列表使用,但是你需要知道要转换成什么类型:这在功能上与您执行以下操作相同:
但避免了将数据实际序列化为JSON,而是使用内存中的事件序列作为中间步骤。
ctzwtxfj2#
我遇到了类似的问题,其中GenericResponse对象包含值列表
objectMapper的使用有助于将LinkedHashMap转换为相应的DTO对象
vktxenjb3#
有一个很好的解决方案可以解决这个问题:
为什么会出现这个问题呢?我猜你在把字符串转换成对象的时候没有指定具体的类型,对象是一个泛型类型的类,比如User。
也许有另一种方法可以解决这个问题,使用Gson而不是ObjectMapper。(或者参见此处Deserializing Generic Types with GSON)
wb1gzix04#
我使用Jackson将LinkedHashMapMap到Json字符串,然后将Json字符串转换为Object
ktecyv1j5#
公共静态列表getObjectList(最终字符串json,最终类cls){
在数组列表中,每个数组都有一个数组类型,每个数组都有一个数组类型。
}
zpf6vheq6#
首先你必须将linkedhashmap转换为JsonString,然后它才能转换为复杂对象。