zoukankan      html  css  js  c++  java
  • Jackson转换为Collection、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)

    1. Jackson转化为Array

    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); }

    转 : https://www.cnblogs.com/guanbin-529/p/11441805.html

  • 相关阅读:
    一个FLAG #03# 蛇形填数
    一个FLAG #02# 逆序输出
    一个FLAG #01# 重学C/C++以及算法
    MAVLink笔记 #01# 维基百科翻(译)
    编译原理 #04# 中缀表达式转化为四元式(JavaScript实现)
    Java开发:手机电话号码校验
    解决java poi循环遍历行getLastRowNum出现不准确的问题
    Redis的安装和简单测试
    JS解析xml字符串,并把xml展示在HTML页面上
    解决cxf+springmvc发布的webservice,缺少types,portType和message标签的问题
  • 原文地址:https://www.cnblogs.com/fps2tao/p/13529844.html
Copyright © 2011-2022 走看看