【问题标题】:com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `com.utils.POJO[]` out of START_OBJECT tokencom.fasterxml.jackson.databind.exc.MismatchedInputException:无法从 START_OBJECT 令牌中反序列化 `com.utils.POJO[]` 的实例
【发布时间】:2020-10-12 00:06:35
【问题描述】:

如何将此 json 转换为 pojo,但它会抛出异常。这是 Date 字段的正确方法吗? 线程“main”com.fasterxml.jackson.databind.exc.MismatchedInputException 中的异常:无法从 START_OBJECT 令牌中反序列化 com.utils.POJO[] 的实例。

 {
        "rentals": [{
            "product": "12345",
            "startDate": "2020-08-31T19:59:59-0400",
            "AmountPaid": 100.0,
            "endDate": "2020-06-02T03:25:06-0400"
            
        }, {
            "product": "6789",
            "startDate": "2020-09-09T00:00:00-0400",
            "AmountPaid": 100.0,
            "endDate": "2020-06-02T02:41:23-0400"
            
        }]
    }






    ObjectMapper mapper = new ObjectMapper(); 
            POJO [] result = mapper.readValue(json, POJO [].class); 
             mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);

    public class POJO {
        
        private String product;
        @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss-0400")
        private Date startDate;
        private String AmountPaid;
        @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss-0400")
        private Date endDate;
    }

【问题讨论】:

  • JSON 文本以 { 开头,这意味着根是一个对象(因此是 START_OBJECT 令牌),其中包含一个名为 rentals 的字段。 ACCEPT_SINGLE_VALUE_AS_ARRAY 功能不是您想要的,UNWRAP_ROOT_VALUE 是。
  • 如何在读取 json 数组时删除出租根目录?

标签: java json


【解决方案1】:

你需要一个根对象。

class ROOT {
    public POJO [] rentals;
}

class POJO {
    public String product;
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss-0400")
    public Date startDate;
    public String AmountPaid;
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss-0400")
    public Date endDate;
}

测试

ObjectMapper mapper = new ObjectMapper();
ROOT result = mapper.readValue(new File("test.json"), ROOT.class);
for (POJO rental : result.rentals) {
    System.out.println("product=" + rental.product +
                     ", startDate=" + rental.startDate +
                     ", AmountPaid=" + rental.AmountPaid +
                     ", endDate=" + rental.endDate);
}

输出

product=12345, startDate=Mon Aug 31 15:59:59 EDT 2020, AmountPaid=100.0, endDate=Mon Jun 01 23:25:06 EDT 2020
product=6789, startDate=Tue Sep 08 20:00:00 EDT 2020, AmountPaid=100.0, endDate=Mon Jun 01 22:41:23 EDT 2020

【讨论】:

    猜你喜欢
    • 2020-02-20
    • 1970-01-01
    • 2019-03-06
    • 2021-09-05
    • 1970-01-01
    • 2020-07-22
    • 2019-06-01
    • 2019-12-22
    • 2019-02-12
    相关资源
    最近更新 更多