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

Jackson转换为Collection、Array的更多相关文章

  1. C#中使用Buffer.BlockCopy()方法将string转换为byte array的方法:

    public static void BlockCopy(Array src, int srcOffset, Array dst, int dstOffset, int count); 将指定数目的字 ...

  2. 关于struts2的checkboxlist、select等标签发生could not be resolved as a collection/array/map/enumeration/iterator type异常的记录

    1 刚进入该界面的时候发生错误,原因是 list="roles"中的这个集合是空的,导致错误 解决办法很简单,不能让list为空 2 刚进入该界面的时候list是有数据的,当点击提 ...

  3. List转换为数组Array的方法

    List<String> list = new ArrayList<String>(); list.add("str1"); list.add(" ...

  4. ibatis遍历数组:ParameterObject or property was not a Collection, Array or Iterator.

    这个问题在使用ibatis的<iterate></iterate>时出现的,很简单,但是蛋疼了很久,记下来 首先从错误提示看,明显意思是你给出ibatis的参数不对路,人家不认 ...

  5. Android 高级 Jackson Marshalling(serialize)/Unmarshalling(deserialize)

    本文内容 高级 Jackson Marshalling 只序列化符合自定义标准的字段 把 Enums 序列化成 JSON 对象 JsonMappingException(没有找到类的序列化器) Jac ...

  6. Mybatis中的collection、association来处理结果映射

    前不久的项目时间紧张,为了尽快完成原型开发,写了一段效率相当低的代码. 最近几天闲下来,主动把之前的代码优化了一下:)   标签:Java.Mybatis.MySQL 概况:本地系统从另外一个系统得到 ...

  7. mybatis ForEach Collection集合等规范解析(转)

    转自:http://blog.csdn.net/wj3319/article/details/9025349 在SQL开发过程中,动态构建In集合条件查询是比较常见的用法,在Mybatis中提供了fo ...

  8. Jackson如何使JSON输出变得优雅?

    本篇文章翻译自:How to enable pretty print JSON output (Jackson) 在这篇文章中,我们将教你如何利用Jackson Library在控制台或者JSP页面优 ...

  9. MyBatis的foreach语句详解 list array map

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主要有 item,index,collection,open,separator,close.it ...

随机推荐

  1. electron串口通信使用serialport安装报错

    1.报错信息没有安装python环境 1 gyp ERR! find Python 2 gyp ERR! find Python Python is not set from command line ...

  2. element 表格行内进行编辑

    <template> <div class="process_manage"> <el-card class="box-card" ...

  3. 【jvm】09-full gc分析思路

    [jvm]09-full gc分析思路 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有帮助到你的话请顺手点个赞. ...

  4. Java初学者作业——编写Java程序,输入一个数字,实现该数字阶乘的计算。

    返回本章节 返回作业目录 需求说明: 编写Java程序,输入一个数字,实现该数字阶乘的计算.一个数字的阶乘是所有小于及等于该数的正整数的积,自然数n的阶乘写作n! .例如,5的阶乘等于1*2*3*4* ...

  5. Swoole 中使用 Table 内存表实现进程间共享数据

    背景 在多进程模式下进程之间的内存是相互隔离的,在一个工作进程中的全局变量和超全局变量,在另一个工作进程中是无法读取和操作的. 如果只有一个工作进程,则不存在进程隔离问题,可以使用全局变量和超全局变量 ...

  6. github 创建网络仓库 ,使用git工具将本地文件上传/删除 --- 心得

    1.前言 使用  git做项目控制版本工具,当然,使用SVN也可以,但是,git让人感觉更先进一些,与GitHub结合,用起来很方便,服务端由官网控制. 而SVN分客户端和服务端,都是个人控制,因此, ...

  7. Feign的应用

    一.定义 可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样 它集成了ribbon.hystrix.eureka组件 Feign的日志级别需要自定义,因为日志是单独的 ...

  8. SYCOJ4972的幂次方

    题目- 2的幂次方 (shiyancang.cn) 递归题 #include<bits/stdc++.h> using namespace std; int k; void f(int n ...

  9. 《设计模式面试小炒》策略和工厂模式替代业务场景中复杂的ifelse

    <设计模式面试小炒>策略和工厂模式替代业务场景中复杂的ifelse 我是肥哥,一名不专业的面试官! 我是囧囧,一名积极找工作的小菜鸟! 囧囧表示:小白面试最怕的就是面试官问的知识点太笼统, ...

  10. 关于启动bash提示‘bash: export: `//这是新的': not a valid identifier’的解决办法

    学习linux以来将centos改的也不少了,也不知道这个问题是由于那个修改来的.最近改bash的操作环境配置文件,用到了~/.bashrc这个文件,发现里面被我修改过. 那是当年安装fcitx输入法 ...