解决Jackson解析嵌套类问题(MismatchedInputException)

 更新时间:2022年06月07日 09:48:04   作者:CrazySnail_x  
这篇文章主要介绍了解决Jackson解析嵌套类问题(MismatchedInputException),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Jackson解析嵌套类(MismatchedInputException)

具体报错如下

问题描述:Jackson解析嵌套类问题 

调用接口返回json格式的数据,使用Jackson解析参数转换成对象:

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class PixlIdDto implements Serializable {
 
    @JsonIgnore
    private static final long serialVersionUID = -5776690969534186379L;
 
    @JsonProperty("models")
    private List<Models> models;
 
    @Data
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class Models implements Serializable {
 
        @JsonIgnore
        private static final long serialVersionUID = 9189184337502771734L;
 
        @JsonProperty("medias")
        private List<Medias> medias;
 
        @JsonProperty("code")
        private String code;
        @Data
        @JsonIgnoreProperties(ignoreUnknown = true)
        public class Medias implements Serializable {
 
            @JsonIgnore
            private static final long serialVersionUID = 136346277159168673L;
 
            @JsonProperty("mediaZones")
            private List<MediaZones> mediaZones;
            @Data
            @JsonIgnoreProperties(ignoreUnknown = true)
            public class MediaZones implements Serializable {
 
                @JsonIgnore
                private static final long serialVersionUID = 7683892920280290206L;
 
                @JsonProperty("medias")
                private List<MediasInner> medias;
 
                @JsonProperty("name")
                private String name;
                @Data
                @JsonIgnoreProperties(ignoreUnknown = true)
                public class MediasInner implements Serializable {
 
                    @JsonIgnore
                    private static final long serialVersionUID = 8653771742539974404L;
 
                    @JsonProperty("displayOrder")
                    private int displayOrder ;
 
                    @JsonProperty("pixlId")
                    private String pixlId;
                }
            }
        }
    }
}

问题本质为:内部非静态类无法实例化

你需要做两件事:

  • 给内部类前面加上static
  • 给内部类加上默认构造函数

改过后的内部类像这样:

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class PixlIdDto implements Serializable {
 
    @JsonIgnore
    private static final long serialVersionUID = -5776690969534186379L;
 
    @JsonProperty("models")
    private List<Models> models;
 
    @Data
    @JsonIgnoreProperties(ignoreUnknown = true)
    @NoArgsConstructor
    public static class Models implements Serializable {
 
        @JsonIgnore
        private static final long serialVersionUID = 9189184337502771734L;
 
        @JsonProperty("medias")
        private List<Medias> medias;
 
        @JsonProperty("code")
        private String code;
 
        @Data
        @JsonIgnoreProperties(ignoreUnknown = true)
        @NoArgsConstructor
        public static class Medias implements Serializable {
 
            @JsonIgnore
            private static final long serialVersionUID = 136346277159168673L;
 
            @JsonProperty("mediaZones")
            private List<MediaZones> mediaZones;
 
            @Data
            @JsonIgnoreProperties(ignoreUnknown = true)
            @NoArgsConstructor
            public static class MediaZones implements Serializable {
 
                @JsonIgnore
                private static final long serialVersionUID = 7683892920280290206L;
 
                @JsonProperty("medias")
                private List<MediasInner> medias;
 
                @JsonProperty("name")
                private String name;
 
                @Data
                @JsonIgnoreProperties(ignoreUnknown = true)
                @NoArgsConstructor
                public static class MediasInner implements Serializable {
 
                    @JsonIgnore
                    private static final long serialVersionUID = 8653771742539974404L;
 
                    @JsonProperty("displayOrder")
                    private int displayOrder;
 
                    @JsonProperty("pixlId")
                    private String pixlId;
                }
            }
        }
    }
}

问题完美解决。

Jackson处理嵌套Json数据

数据 ------》打印每条数据

{
  "ID": 10001,
  "detail": "detail",
  "json_format_version": 1.0,
  "other_info": {
    "array_one": [
      [855, 410],
      [854, 411],
      [847, 411],
      [846, 410],
      [845, 410],
      [844, 409]
    ],
    "array_two": [
      [832, 303],
      [829, 303],
      [828, 302],
      [825, 302],
      [824, 301]
    ],
    "array_three": [
      [1013, 224],
      [1012, 225],
      [1010, 225],
      [1009, 226],
      [1023, 224]
    ],
    "point": [853, 310],
    "boolean": true
  }
}

代码

public class Test {
    public static void main(String[] args) throws IOException {
//        File file = new File("src/main/resources/doc/windABC.json");
//        FileInputStream fip = new FileInputStream(file);
        BufferedReader br = new BufferedReader(new FileReader("src/main/resources/doc/resource.json"));
        ObjectMapper mapper = new ObjectMapper();
        //读取json的节点
        JsonNode node = mapper.readTree(br);
        //获取所有的key
        Iterator<String> keys = node.fieldNames();

        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("src/main/resources/doc/result.txt"));
        bufferedWriter.write("项目:**********\t\t");
        bufferedWriter.write("部门:**********\t\t");
        bufferedWriter.write("工号:**********\n");

        while (keys.hasNext()) {
            String key = keys.next();
            bufferedWriter.write(key + ":");
            bufferedWriter.newLine();
            if (key.equals("other_info")) {
                JsonNode other_infoNode = mapper.readTree(node.get(key).toString());
                Iterator<String> other_info_Key = other_infoNode.fieldNames();
                for (JsonNode jsonNode : other_infoNode) {
                    bufferedWriter.write(other_info_Key.next().toString()  + ":\n");
                    isArrayNode(jsonNode,mapper,bufferedWriter);
                }
            } else {
                bufferedWriter.write(node.get(key).asText());
                bufferedWriter.newLine();
            }
            bufferedWriter.newLine();

        }
        bufferedWriter.close();
        br.close();
    }

    public static void isArrayNode(JsonNode jsonNode,ObjectMapper mapper,BufferedWriter bufferedWriter) throws IOException {
        if (jsonNode.isArray()) {
            for (JsonNode node1 : jsonNode) {
                isArrayNode(node1,mapper,bufferedWriter);//递归调用,判断是否数组嵌套数组
            }
            bufferedWriter.newLine();
        }else {
           bufferedWriter.write(jsonNode.asText());
           bufferedWriter.newLine();
        }
    }
}

输出结果

项目:********        部门:********        工号:********
ID:
10001

detail:
detail

json_format_version:
1.0

other_info:
array_one:
855
410

854
411

847
411

846
410

845
410

844
409


array_two:
832
303

829
303

828
302

825
302

824
301


array_three:
1013
224

1012
225

1010
225

1009
226

1023
224


point:
853
310

boolean:
true

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 使用Jackson 处理 null 或者 空字符串

    使用Jackson 处理 null 或者 空字符串

    这篇文章主要介绍了使用Jackson 处理 null 或者 空字符串,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • springboot使用JdbcTemplate完成对数据库的增删改查功能

    springboot使用JdbcTemplate完成对数据库的增删改查功能

    这篇文章主要介绍了springboot使用JdbcTemplate完成对数据库的增删改查功能,需要的朋友可以参考下
    2017-12-12
  • application.yaml与bootstrap.yaml的使用

    application.yaml与bootstrap.yaml的使用

    这篇文章主要介绍了application.yaml与bootstrap.yaml的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Spring Boot整合Redis的完整步骤

    Spring Boot整合Redis的完整步骤

    这篇文章主要给大家介绍了关于Spring Boot整合Redis的完整步骤,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • Java检查字符串是否一致的四种方法

    Java检查字符串是否一致的四种方法

    字符串比较是常见的操作,包括比较相等、比较大小、比较前缀和后缀串等,在 Java 中,比较字符串的常用方法有四个:equals(),equalsIgnoreCase(),compareTo()和compareToIgnoreCase(),下面详细介绍这四个方法的使用
    2024-04-04
  • Mybatis返回类型为Map时遇到的类型转化的异常问题

    Mybatis返回类型为Map时遇到的类型转化的异常问题

    这篇文章主要介绍了Mybatis返回类型为Map时遇到的类型转化的异常问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • SpringBoot利用jpa连接MySQL数据库的方法

    SpringBoot利用jpa连接MySQL数据库的方法

    这篇文章主要介绍了SpringBoot利用jpa连接MySQL数据库的方法,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • struts2入门介绍及代码实例

    struts2入门介绍及代码实例

    这篇文章主要介绍了struts2入门介绍及代码实例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Java正则表达式处理特殊字符转义的方法

    Java正则表达式处理特殊字符转义的方法

    由于正则表达式定了一些特殊字符,而有时候需要对这些特殊字符进行匹配的话就需要进行转义了,下面这篇文章主要给大家介绍了Java正则表达式处理特殊字符转义的方法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • 一小时迅速入门Mybatis之实体类别名与多参数 动态SQL

    一小时迅速入门Mybatis之实体类别名与多参数 动态SQL

    这篇文章主要介绍了一小时迅速入门Mybatis之实体类别名与多参数 动态SQL,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09

最新评论