jackson 将LinkedHashMap转换为复杂对象

vsdwdz23  于 2022-11-08  发布在  其他
关注(0)|答案(6)|浏览(329)

我有一个在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”。

t1qtbnec

t1qtbnec1#

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

ctzwtxfj

ctzwtxfj2#

我遇到了类似的问题,其中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>>() { });
vktxenjb

vktxenjb3#

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

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。
也许有另一种方法可以解决这个问题,使用Gson而不是ObjectMapper。(或者参见此处Deserializing Generic Types with 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();
wb1gzix0

wb1gzix04#

我使用Jackson将LinkedHashMapMap到Json字符串,然后将Json字符串转换为Object

Map<String, String> mappingValue
OBJECTA a = objectMapper.readValue(toJson(mappingValue), OBJECTA.class);

public static String toJson(Object object) {
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    String jsonString = "";

    try {
        jsonString = mapper.writeValueAsString(object);
    } catch (JsonProcessingException var4) {
        var4.printStackTrace();
        jsonString = "Can't build json from object";
    }

    return jsonString;
}
ktecyv1j

ktecyv1j5#

公共静态列表getObjectList(最终字符串json,最终类cls){
在数组列表中,每个数组都有一个数组类型,每个数组都有一个数组类型。
}

zpf6vheq

zpf6vheq6#

首先你必须将linkedhashmap转换为JsonString,然后它才能转换为复杂对象。

相关问题