com.fasterxml.jackson.databind.exc.MismatchedInputException:无法从START_ARRAY令牌中反序列化对象实例-JAVA

时间:2020-09-25 19:09:50

标签: java json spring-boot spring-data-jpa jackson-databind

获取MismatchedInputException。在这里搜索了很多问题,但尚未找到解决方案。

代码:

import /path/to/file/Bars;
List<Bars> barResults = null;
public boolean validateData() throws IOException {
        boolean flag = false;
        try {
            if (Data.read() != -1) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(Data));
                String line;
                while ((line = reader.readLine()) != null) {
                    line = "[{" + line;
                    System.out.println(line);
                    ObjectMapper om = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
                    Bars ms = om.readValue(line, Bars.class);
                    System.out.println(ms);
                    break;
                }
                reader.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return flag;
    }

Json://例如,缩短

[{"createdOn":1601058721310,"lastUpdated":null,"lastUpdatedBy":null,"createdBy":null,"appId":null,"logical":"N","calculationDateTime":1601058721310,"mtaVersionNumber":null,"storageRegionName":"texas","createdOnDate":1601058721310,"lastUpdatedDate":0}]

输出:

[{"createdOn":1601058721310,"lastUpdated":null,"lastUpdatedBy":null,"createdBy":null,"appId":null,"logical":"N","calculationDateTime":1601058721310,"mtaVersionNumber":null,"storageRegionName":"texas","createdOnDate":1601058721310,"lastUpdatedDate":0}]
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `object` out of START_ARRAY token
 at [Source: (StringReader); line: 1, column: 1]

我不确定导致此异常的原因。启动应用程序时,我运行并读取JSON很好。但是抛出异常。

1 个答案:

答案 0 :(得分:1)

在调用readValue时,您要传递Bars.class作为第二个参数,这告诉杰克逊第一个参数(line)是Bars的JSON表示形式实例,这就是它应该返回的内容。

JSON对象以{开头,并且由于您已要求Jackson对该对象反序列化,因此它希望输入以{开头。但是,您传入的JSON line不是Bars实例:它是一个包含Bars实例的数组,并且以[开头。

因此它抛出一条错误消息,提示“有人告诉我对象在这里,但我却找到了数组的开头”。

要解决此问题,您可以要求Jackson通过将readValue的第二个参数更改为Bars[].class来反序列化“ Bar”对象的数组,然后从该数组中提取bar实例,或者可以停止在行的开头添加“ [”,并在行的末尾切掉“]”,以便它只是一个对象,而不是包含该对象的数组。