如何用杰克逊解组对象

时间:2021-04-18 18:03:14

标签: java jackson unmarshalling

给定 JSON 如下

 [{"itemId":6,"itemTypeId":2,"expDate":"2021-04-17T22:00:00.000+00:00","creationDate":"2021-04-18T09:44:52.417+00:00","transactions":[{"transactionType":"USE","userId":0,"quantityBefore":6.0,"quantityAfter":4.0,"locIdBefore":2,"locIdAfter":2}]}]

我正在尝试将 JSON 解组为如上定义的 POJO,但是得到了

UnsupportedOperationException

我的想法是使用简单的杰克逊映射:

 public static ArrayList<HistoryItem> convert (String response){
    ObjectMapper mapper = new ObjectMapper();
    ArrayList<HistoryItem> itemList = new ArrayList<>();
    try {
        itemList = (ArrayList<HistoryItem>)mapper.readValue(response, new TypeReference<List<HistoryItem>>(){});
    } catch (IOException e) {
        e.printStackTrace();
    }
    return itemList;
}

对于具有简单对象类型字段的简单对象,例如 String、Long、Integer 等,它工作正常,但是当我添加 ArrayList 时,我得到了那个错误。任何想法我的问题是什么?

我的类 HistoryItemDto:

public class HistoryItemDto {
private Long itemId;
private Long itemTypeId;
private Date expDate;
private Date creationDate;
private ArrayList<HistoryTransactionDto> transactions;}

我的类 HistoryTransactionDto:

public class HistoryTransactionDto {
private TransactionType transactionType;
private Long userId;
private float quantityBefore;
private float quantityAfter;
private Long locIdBefore;
private Long locIdAfter;}

它们都包括 getter、setter、无参数构造函数和每个参数构造函数。

提前......检查了很多网站,如 baeldung、jackson 文档、stackoverflow 的帖子,但没有发现任何能回答我的原因。

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,为了解决这个问题,不要使用列表(包括 ArrayList 或任何其他类型的迭代器),而是使用基本数组:

public static ArrayList<HistoryItem> convert (String response) {
    ObjectMapper mapper = new ObjectMapper();
    ArrayList<HistoryItem> itemAsArrayList = new ArrayList<>();

    try {
        HistoryItem[] responseAsArray = mapper.readValue(response, HistoryItem[].class);
        
        Collections.addAll(itemAsArrayList, responseAsArray);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return itemAsArrayList;
}