【问题标题】:How to unmarshall object with jackson如何用杰克逊解组对象
【发布时间】:2021-04-18 18:03:14
【问题描述】:

给定 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;
}

对于具有简单对象类型(如字符串、长整数、整数等)的字段的简单对象,它工作正常,但是当我添加 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 的帖子,但没有找到任何答案。

【问题讨论】:

  • 您到底遇到了什么类型的错误?
  • @mnestorov UnsupportedOperationException 如帖子中所写,仅在跟踪 convert 方法的第 5 行时可见
  • 我的错,完全错过了
  • 在您的convert 方法中,您使用HistoryItem,但稍后您有课程HistoryItemDto。可能这只是您问题中的一个错字。或者这真的是两个不同的类?
  • 如果我将 HistoryItemDto 重命名为 HistoryItem,它可以完美运行。 (JDK11)

标签: java jackson unmarshalling


【解决方案1】:

我也遇到过同样的问题,为了解决这个问题,不要使用列表(包括 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;
}

【讨论】:

  • 谢谢@GuilgermeBarboza!所以答案是 JACKSON 在编组包含其他对象的 ArrayList 的对象时遇到问题!
猜你喜欢
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
  • 2016-05-15
  • 2013-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多