• Jackson转换为Collection、Array


    1. Jackson转化为Array

    注意的地方就是实体类一定要有无参的构造方法,否则会报异常

    //com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.example.jackjson.UnmarshallCollectionOrArray$User` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
    package com.example.jackjson;
    
    import com.fasterxml.jackson.core.type.TypeReference;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.type.CollectionType;
    import org.assertj.core.util.Lists;
    import org.junit.Assert;
    import org.junit.Test;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.LinkedHashMap;
    import java.util.List;
    
    /**
     * @author: GuanBin
     * @date: Created in 下午2:33 2019/8/31
     */
    public class UnmarshallCollectionOrArray {
    
        @Test
        public void unmarshallToArray() throws IOException {
            ObjectMapper mapper = new ObjectMapper();
            ArrayList<User> users = Lists.newArrayList(new User("tom", 10), new User("sam", 11));
            String str = mapper.writeValueAsString(users);
            System.out.println("user json:" + str);
            //若user没无参构造方法会报错
            //com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.example.jackjson.UnmarshallCollectionOrArray$User` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
            // at [Source: (String)"[{"name":"tom","age":10},{"name":"sam","age":11}]"; line: 1, column: 3] (through reference chain: java.lang.Object[][0])
            User[] userArray = mapper.readValue(str, User[].class);
            Assert.assertTrue(userArray[0] instanceof User);
        }
    
     
    
        static class User {
            public User() {
            }
    
            public User(String name, int age) {
                this.name = name;
                this.age = age;
            }
    
            private String name;
            private int age;
    
            public String getName() {
                return name;
            }
    
            public void setName(String name) {
                this.name = name;
            }
    
            public int getAge() {
                return age;
            }
    
            public void setAge(int age) {
                this.age = age;
            }
        }
    }

    2. Jackson转化为list

     1)如果直接使用mapper.readValue(str, List.class); 虽然不会异常,但是list中的每个元素都是LinkedHashMap,而强转为User会报错;故如果转化为List<User> 用此方法是不行的

     @Test
        public void unmarshallToList() throws IOException {
            ObjectMapper mapper = new ObjectMapper();
            ArrayList<User> users = Lists.newArrayList(new User("tom", 10), new User("sam", 11));
            String str = mapper.writeValueAsString(users);
            System.out.println("user json:" + str);
            //若user没无参构造方法会报错
            //com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.example.jackjson.UnmarshallCollectionOrArray$User` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
            // at [Source: (String)"[{"name":"tom","age":10},{"name":"sam","age":11}]"; line: 1, column: 3] (through reference chain: java.lang.Object[][0])
            List list = mapper.readValue(str, List.class);
            Assert.assertTrue(list.get(0) instanceof LinkedHashMap);
        }

    2) 正确转化为list的有两种方式

         1. 使用TypeReference

            List<User> list = mapper.readValue(str, new TypeReference<List<User>>() { });

        @Test
        public void unmarshallToListOneWay() throws IOException {
            ObjectMapper mapper = new ObjectMapper();
            ArrayList<User> users = Lists.newArrayList(new User("tom", 10), new User("sam", 11));
            String str = mapper.writeValueAsString(users);
            System.out.println("user json:" + str);
            //若user没无参构造方法会报错
            //com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.example.jackjson.UnmarshallCollectionOrArray$User` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
            // at [Source: (String)"[{"name":"tom","age":10},{"name":"sam","age":11}]"; line: 1, column: 3] (through reference chain: java.lang.Object[][0])
            List<User> list = mapper.readValue(
                    str, new TypeReference<List<User>>() { });
            Assert.assertTrue(list.get(0) instanceof User);
        }

        2. 获取CollectionType

           CollectionType javaType = mapper.getTypeFactory().constructCollectionType(List.class, User.class);

           List<User> list = mapper.readValue(str, javaType);

        @Test
        public void unmarshallToListTwoWay() throws IOException {
            ObjectMapper mapper = new ObjectMapper();
            ArrayList<User> users = Lists.newArrayList(new User("tom", 10), new User("sam", 11));
            String str = mapper.writeValueAsString(users);
            System.out.println("user json:" + str);
            //若user没无参构造方法会报错
            //com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.example.jackjson.UnmarshallCollectionOrArray$User` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
            // at [Source: (String)"[{"name":"tom","age":10},{"name":"sam","age":11}]"; line: 1, column: 3] (through reference chain: java.lang.Object[][0])
    
            CollectionType javaType = mapper.getTypeFactory().constructCollectionType(List.class, User.class);
            List<User> list = mapper.readValue(str, javaType);
            Assert.assertTrue(list.get(0) instanceof User);
        }

    注意:以上转化过程都要求实体有无参的构造方法,否则会报异常

    demo test:https://github.com/BinbinGuan/rabbitMq-test/commit/2c27f547ff4fdb249cd0d64294e3855d00993a96

  • 相关阅读:
    Flash中先获取flv的尺寸然后再显示的方法
    雕虫小艺:Slider控件的制作(Flash)
    用几十行代码写一个可以在PC Web,PC桌面,安卓,iOS上运行的程序
    仰望星空,结果南辕北辙
    Flash播放mp4的两个问题:编码问题和需要下载完后才能播放的问题
    只学一点点:我的技术学习策略
    2012年计划
    提高ipad浏览器下大尺寸xml文件解析的性能
    html5/haXe开发偶感
    支点:技术选择的精髓
  • 原文地址:https://www.cnblogs.com/guanbin-529/p/11441805.html
Copyright © 2020-2023  润新知