一、jackson无法解析value为[]的json

当入参为{xxxx1:[1,2,3],xxxx2:[obj1,obj2,obj3]}时,springmvn controller接收入参写为Long[] xxxx1,无法解析,报错

解决方案:

1.@RequestBody只能使用一次

2.使用map接收,再用get获取

二、如上,当数组为POJO时,通过直接map.get然后强制转换,不能成功,使用的时候还是LinkedHashMap

解决方案:

1.先将LinkedHashMap转为json,再讲json转为对象,如下JsonUtils的convertObject方法,转换List使用convertObjectList方法

package com.performancetest.common.utils;

import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map; public class JsonUtils { /**
* <p>
* 对象转JSON字符串
* </p>
*/
public static String object2Json(Object obj) {
String result = null;
try {
ObjectMapper objectMapper = new ObjectMapper();
result = objectMapper.writeValueAsString(obj);
} catch (IOException e) {
e.printStackTrace();
}
return result;
} public static Map object2Map(Object obj) {
String object2Json = object2Json(obj);
Map<?, ?> result = jsonToMap(object2Json);
return result;
} /**
* <p>
* JSON字符串转Map对象
* </p>
*/
public static Map<?, ?> jsonToMap(String json) {
return json2Object(json, Map.class);
} /**
* <p>
* JSON转Object对象
* </p>
*
*/
public static <T> T json2Object(String json, Class<T> cls) {
T result = null;
try {
ObjectMapper objectMapper = new ObjectMapper();
result = objectMapper.readValue(json, cls);
} catch (IOException e) {
e.printStackTrace();
} return result;
} public static <T> T convertObject(Object srcObject, Class<T> destObjectType) {
String jsonContent = object2Json(srcObject);
return json2Object(jsonContent, destObjectType);
} public static <T> List convertObjectList(List<LinkedHashMap> list, Class<T> destObjectType){
List result =new ArrayList<>();
list.stream().forEach(x->{
result.add(convertObject(x,destObjectType));
});
return result;
} }

三、如上转换时,报出错,jackson转换DateFormat类型时,不支持yyyy-MM-DD HH-mm-ss格式的日期,报错

解决方案:

方案1.在Date类型上加@JsonFormat( pattern="yyyy-MM-dd HH:mm:ss"),如下

(弊端:每个字段都得加,麻烦,没从根本上解决问题,不推荐,推荐方案2)

@JsonFormat( pattern="yyyy-MM-dd HH:mm:ss")
private Date updateTime;

方案2.

1.重写DateFormat子类,解析的实收优先用yyyy-MM-dd HH:mm:ss类型解析,不行再用父类

(这里遇到一个坑,启动时报calendar空指针异常,所以在构造函数里加了

this.calendar = dateFormat.getCalendar(); )
package com.performancetest.config;

import java.text.DateFormat;
import java.text.FieldPosition;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date; public class MyDateFormat extends DateFormat { private DateFormat dateFormat; private SimpleDateFormat format1 = new SimpleDateFormat("yyy-MM-dd HH:mm:ss"); public MyDateFormat(DateFormat dateFormat) {
this.dateFormat = dateFormat;
//要添加父类的calendar属性,否则会报空指针异常
this.calendar = dateFormat.getCalendar();
} @Override
public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) {
return dateFormat.format(date, toAppendTo, fieldPosition);
} @Override
public Date parse(String source, ParsePosition pos) { Date date = null; try { date = format1.parse(source, pos);
} catch (Exception e) { date = dateFormat.parse(source, pos);
} return date;
} // 主要还是装饰这个方法
@Override
public Date parse(String source) throws ParseException { Date date = null; try { // 先按我的规则来
date = format1.parse(source);
} catch (Exception e) { // 不行,那就按原先的规则吧
date = dateFormat.parse(source);
} return date;
} // 这里装饰clone方法的原因是因为clone方法在jackson中也有用到
@Override
public Object clone() {
Object format = dateFormat.clone();
return new MyDateFormat((DateFormat) format);
}
}

2.将新写的子类关联到WebConfig中的MappingJackson2HttpMessageConverter Bean,如下代码

package com.performancetest.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import java.text.DateFormat; @Configuration
public class WebConfig { @Autowired
private Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder; @Bean
public MappingJackson2HttpMessageConverter MappingJsonpHttpMessageConverter() { ObjectMapper mapper = jackson2ObjectMapperBuilder.build(); //MyDateFormate解决jackson反序列formdate不支持YYYY-MM-DD HH-mm-ss的格式
// ObjectMapper为了保障线程安全性,里面的配置类都是一个不可变的对象
// 所以这里的setDateFormat的内部原理其实是创建了一个新的配置类
DateFormat dateFormat = mapper.getDateFormat();
MyDateFormat myDateFormat = new MyDateFormat(dateFormat);
mapper.setDateFormat(myDateFormat); MappingJackson2HttpMessageConverter mappingJsonpHttpMessageConverter = new MappingJackson2HttpMessageConverter(
mapper);
return mappingJsonpHttpMessageConverter;
}
}

SpringBoot jackson传入List引起的坑的更多相关文章

  1. 记一次SpringBoot 开发中所遇到的坑和解决方法

    记一次SpringBoot 开发中所遇到的坑和解决方法 mybatis返回Integer为0,自动转型出现空指针异常 当我们使用Integer去接受数据库中表的数据,如果返回的数据中为0,那么Inte ...

  2. springboot项目--传入参数校验-----SpringBoot开发详解(五)--Controller接收参数以及参数校验----https://blog.csdn.net/qq_31001665/article/details/71075743

    https://blog.csdn.net/qq_31001665/article/details/71075743 springboot项目--传入参数校验-----SpringBoot开发详解(五 ...

  3. @RequestBody jackson解析复杂的传入值的一个坑;jackson解析迭代数组;jackson多重数组;jakson数组

    一.实际开发的一个问题. 传入一个json数组,数组中还嵌套数组,运用springboot+Jpa框架,@RequestBody注解传入数据 Controller @ApiOperation(valu ...

  4. SpringBoot + Shiro + shiro.ini 的踩坑记录

    0.写在前面的话 好久没写博客了,诶,好多时候偷懒直接就抓网上的资料丢笔记里了,也就没有自己提炼,偷懒偷懒.然后最近参加了一个网络课程,要交作业的那种,为了能方便看下其他同学的作业,就写了个爬虫把作业 ...

  5. Springboot JackSon

    1. SpringBoot JSON工具包默认是Jackson,只需要引入spring-boot-starter-web依赖包,自动引入相应依赖包: <dependency> <gr ...

  6. springboot整合log4j2遇到的一个坑

    背景 项目中使用springboot,需要用log4j2做日志框架 问题 项目启动报错:Could not initialize Log4J2 logging from classpath:log4j ...

  7. Springboot Jackson配置根本方案, 日期格式化, 时区设置生效

    当项目集成配置的功能越来越多, 说不准哪个配置就影响到了什么. 比如你启用了EnableMvC, 默认配置文件配置的一些文件就失效了. 虽然约定大于配置,让springboot可以极简化构建, 但不熟 ...

  8. spring-boot配置静态资源映射的坑:properties文件不能添加注释

    如此博文所述,Spring Boot 对静态资源映射提供了默认配置 默认将 /** 所有访问映射到以下目录:classpath:/staticclasspath:/publicclasspath:/r ...

  9. springboot整合mybatis遇到的那些坑

    1.接口类(指*Mapper.java)在spring中注册的问题 当控制台打印如下信息: A component required a bean named '*Mapper' that could ...

随机推荐

  1. falling object思路总结

    1.用检测的方法把falling object标记为一个类别,然后检测出类别.这种方式不可行的原因:因为falling object可能是任何东西,所以可能是一个路锥,也可能是一个玻璃瓶,还可能是掉下 ...

  2. DROP INDEX - 删除一个索引

    SYNOPSIS DROP INDEX name [, ...] [ CASCADE | RESTRICT ] DESCRIPTION 描述 DROP INDEX 从数据库中删除一个现存的索引. 要执 ...

  3. HTML5<section>元素

    HTML5<section>元素用来定义页面文档中的逻辑区域或内容的整合(section,区域),比如章节.页眉.页脚或文档中的其他部分. 根据W3C HTML5文档中:section里面 ...

  4. HTML5语义

    语义通俗化为意义,也就是语义化的元素等于意义化的元素,看到这个元素的名称,就知道这个元素的意义,是拿来做什么用的,这就是HTML5的一个新特性,一个具有语义化的元素能够清楚的把元素的意义告诉浏览器和开 ...

  5. EXC_BAD_ACCESS调试

    有时候,你会遇到由EXCBADACCESS造成崩溃. 这篇文件会告诉你什么是EXCBADACCESS,以及它产生的原因.我还会提供一些EXCBADACCESS错误的解决方案. 1. 什么是 EXCBA ...

  6. Unity学习之路——主要类

    学习https://blog.csdn.net/VRunSoftYanlz/article/details/78881752 1.Component类gameObject:组件附加的游戏对象.组件总是 ...

  7. 【动态规划】51nod1780 完美序列

    巧妙的转化:f前两维大小开反TLE了一发…… 如果一个序列的相邻两项差的绝对值小于等于1,那么我们说这个序列是完美的. 给出一个有序数列A,求有多少种完美序列排序后和数列A相同. Input 第一行一 ...

  8. Docker 自动运行Nginx容器

    Dockerfile文件如下: FROM ubuntu #基础镜像 RUN apt-get update #更新apt RUN apt-get -y install nginx #安装nginx VO ...

  9. GoF23种设计模式之行为型模式之策略模式

    传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 1概述           定义一系列算法,把它们一个个都封装起来,并且让它们可以相互 ...

  10. IDEA常用快捷键(不全)

    这里使用的是默认的idea快捷键,如果修改了keymap为其他,那么不适用. 1.格式化代码:Ctrl+Alt+L(可能与QQ的冲突,建议QQ只保留方便的截图,皮) 2.在当前行最后添加分号,或自动补 ...