热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

Springboot如何配置请求的入参和出参json数据格式

这篇文章主要介绍了springboot如何配置请求的入参和出参json数据格式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了spring boot如何配置请求的入参和出参json数据格式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

请求入参数据格式配置,以日期格式为例:

编写日期编辑器类:

import first.zxz.tools.DateUtil;
import java.beans.PropertyEditorSupport;
/**
 * 日期编辑器
 *
 * @author zhangxz
 * @date 2019-11-12 20:01
 */
public class DateEditor extends PropertyEditorSupport {
 /**
  * 是否将null转换为空字符串
  */
 private final boolean nullAsEmpty;
 public DateEditor() {
  this(true);
 }
 public DateEditor(boolean nullAsEmpty) {
  this.nullAsEmpty = nullAsEmpty;
 }
 @Override
 public void setAsText(String text) {
  if (text == null) {
   if (nullAsEmpty) {
    setValue("");
   } else {
    setValue(null);
   }
  } else {
   setValue(DateUtil.parse(text));
  }
 }

}

其中用到的日期工具类如下:

public class DateUtil {

 private static final String DATE_FORMAT_1 = "yyyy-MM-dd";
 private static final String DATE_FORMAT_2 = "yyyy/MM/dd";
 private static final String DATE_FORMAT_3 = "yyyyMMdd";
 private static final String DATE_TIME_FORMAT_1 = DATE_FORMAT_1 + " HH:mm:ss";
 private static final String DATE_TIME_FORMAT_2 = DATE_FORMAT_2 + " HH:mm:ss";
 private static final String DATE_TIME_FORMAT_3 = DATE_FORMAT_3 + "HHmmss";

 //key为正则表达式,value为对应的日期格式
 private static final HashMap DATE_REGEX_FORMATTER_MAP = new HashMap<>();

 static {
  DATE_REGEX_FORMATTER_MAP.put(DateRegexConst.DATE_1, DATE_FORMAT_1);
  DATE_REGEX_FORMATTER_MAP.put(DateRegexConst.DATE_2, DATE_FORMAT_2);
  DATE_REGEX_FORMATTER_MAP.put(DateRegexConst.DATE_3, DATE_FORMAT_3);
  DATE_REGEX_FORMATTER_MAP.put(DateRegexConst.DATE_TIME_1, DATE_TIME_FORMAT_1);
  DATE_REGEX_FORMATTER_MAP.put(DateRegexConst.DATE_TIME_2, DATE_TIME_FORMAT_2);
  DATE_REGEX_FORMATTER_MAP.put(DateRegexConst.DATE_TIME_3, DATE_TIME_FORMAT_3);
 }

 //提示语:所有可用的日期格式
 public static final String ALL_USABLE_DATE_FORMATS = DATE_REGEX_FORMATTER_MAP.values().toString() + ",以及时间戳;";

 /**
  * 根据输入的字符串,进行格式化,并输入日期数据
  * 注意:格式化之前,会进行null和空字符串过滤;格式化时,会去除字符串两端的空字符串
  *
  * @param formattedDateStr 日期字符串数据
  * @return java.util.Date
  * @author Zxz
  * @date 2019/11/6 15:07
  **/
 public static Date parse(String formattedDateStr) {
  if (formattedDateStr == null || formattedDateStr.trim().length() <= 0) {
   throw new StringEmptyException();
  }

  for (Map.Entry entry : DATE_REGEX_FORMATTER_MAP.entrySet()) {
   if (formattedDateStr.trim().matches(entry.getKey())) {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(entry.getValue());
    try {
     return simpleDateFormat.parse(formattedDateStr.trim());
    } catch (ParseException e) {
     e.printStackTrace();
     throw new DateFormatException();
    }
   }
  }

  try {
   Long aLOng= Long.valueOf(formattedDateStr);
   return new Date(aLong);
  } catch (NumberFormatException e) {
   //格式不匹配
   throw new DateFormatException();
  }

 }
}

把编辑器加入web的绑定初始化配置:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.support.FormattingConversionService;
import org.springframework.validation.Validator;
import org.springframework.web.bind.support.ConfigurableWebBindingInitializer;
import simple.proj.zxz.play.config.editor.DateEditor;

import java.util.Date;

/**
 * 配置请求 bean数据接收格式,例如date格式
 *
 * @author zhangxz
 * @date 2019-11-12 19:56
 */

@Configuration
public class WebBindingInitializerConfig {

 /**
  * 配置请求入参数据格式,参考{@link simple.proj.zxz.play.config.editor.DateEditor}
  *
  * @param mvcConversionService mvc版本业务
  * @param mvcValidator   mvc校验器
  * @return org.springframework.web.bind.support.ConfigurableWebBindingInitializer
  * @author zhangxz
  * @date 2019/11/13 10:40
  */
 @Bean
 public ConfigurableWebBindingInitializer configurableWebBindingInitializer(FormattingConversionService mvcConversionService, Validator mvcValidator) {
  ConfigurableWebBindingInitializer initializer = new ConfigurableWebBindingInitializer();
  initializer.setConversionService(mvcConversionService);
  initializer.setValidator(mvcValidator);

  initializer.setPropertyEditorRegistrar(propertyEditorRegistry -> {
   //PropertyEditor 非线程安全
   propertyEditorRegistry.registerCustomEditor(Date.class, new DateEditor());
  });
  return initializer;
 }
}

入参的日期数据格式配置完成,可以接收的日期格式在日期工具类可以看到,有以下几种:yyyy-mm-dd,时间戳,yyyy-mm-dd hh:mm:ss等。

请求出参格式配置,包括空字符串,空数组,以及日期格式化输出

编写空字符串序列器:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;

/**
 * 空字符串序列器
 *
 * @author zhangxz
 * @date 2019-11-12 22:05
 */
public class NullStringSerializer extends JsonSerializer {

 @Override
 public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
   throws IOException, JsonProcessingException {
  jsonGenerator.writeString("");
 }
}

编写空数组序列器

/**
 * 空数组或集合序列器
 *
 * @author zhangxz
 * @date 2019-11-12 22:04
 */

public class NullArraySerializer extends JsonSerializer {

 @Override
 public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
  jgen.writeStartArray();
  jgen.writeEndArray();
 }
}

编写日期序列器

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;
import java.util.Date;

/**
 * 日期序列器
 *
 * @author zhangxz
 * @date 2019-11-12 23:01
 */
public class DateSerializer extends JsonSerializer {

 /**
  * 日期序列化方法,返回时间戳格式
  *
  * @param o     数值
  * @param jsonGenerator  json生成器
  * @param serializerProvider 序列器
  * @author zhangxz
  * @date 2019/11/13 10:41
  */
 @Override
 public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
  jsonGenerator.writeNumber(((Date) o).getTime());
 }
}

编写总序列器

import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializationConfig;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;

import java.util.Collection;
import java.util.Date;
import java.util.List;

/**
 * 总序列器
 *
 * @author zhangxz
 * @date 2019-11-12 22:07
 */

public class GeneralSerializer extends BeanSerializerModifier {

 //空数组
 private JsonSerializer _nullArraySerializer = new NullArraySerializer();
 //空字符串
 private JsonSerializer _nullStringSerializer = new NullStringSerializer();
 //日期类型
 private JsonSerializer dateSerializer = new DateSerializer();

 @Override
 public List changeProperties(SerializationConfig config, BeanDescription beanDesc,
              List beanProperties) {
  for (BeanPropertyWriter beanProperty : beanProperties) {
   if (isArrayType(beanProperty)) {
    beanProperty.assignNullSerializer(this._nullArraySerializer);
   } else if (isStringType(beanProperty)) {
    beanProperty.assignNullSerializer(this._nullStringSerializer);
   } else if (isDateType(beanProperty)) {
    beanProperty.assignSerializer(this.dateSerializer);
   }
  }
  return beanProperties;
 }

 private boolean isStringType(BeanPropertyWriter writer) {
  Class clazz = writer.getType().getRawClass();
  return clazz == String.class;
 }

 private boolean isDateType(BeanPropertyWriter writer) {
  return Date.class == writer.getType().getRawClass();
 }

 private boolean isArrayType(BeanPropertyWriter writer) {
  Class clazz = writer.getType().getRawClass();
  return clazz.isArray() || Collection.class.isAssignableFrom(clazz);
 }
}

把总序列器加入web配置中:

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import simple.proj.zxz.play.config.serializer.GeneralSerializer;

/**
 * @description: 配置jackson 序列器
 * @author: zhangxz
 * @create: 2019-11-12 22:02
 */


@Configuration
public class JacksonConfig {

 /**
  * 出参数据格式配置,参考类 {@link simple.proj.zxz.play.config.serializer.GeneralSerializer}
  *
  * @return org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
  * @author zhangxz
  * @date 2019/11/13 10:34
  */
 @Bean
 public MappingJackson2HttpMessageConverter mappingJacksonHttpMessageConverter() {

  final MappingJackson2HttpMessageConverter cOnverter= new MappingJackson2HttpMessageConverter();
  ObjectMapper mapper = converter.getObjectMapper();
  mapper.setSerializerFactory(mapper.getSerializerFactory().withSerializerModifier(new GeneralSerializer()));

  return converter;
 }
}

请求出参配置完成,出参格式如下:null的字符串输出为空字符串,null的数组输出为空数组,date数据格式输出为时间戳。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • PDF内容编辑的两种小方法,你知道怎么操作吗?
    本文介绍了两种PDF内容编辑的方法:迅捷PDF编辑器和Adobe Acrobat DC。使用迅捷PDF编辑器,用户可以通过选择需要更改的文字内容并设置字体形式、大小和颜色来编辑PDF文件。而使用Adobe Acrobat DC,则可以通过在软件中点击编辑来编辑PDF文件。PDF文件的编辑可以帮助办公人员进行文件内容的修改和定制。 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 本文介绍了Windows Vista操作系统中的用户账户保护功能,该功能是为了增强系统的安全性而设计的。通过对Vista测试版的体验,可以看到系统在安全性方面的进步。该功能的引入,为用户的账户安全提供了更好的保障。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • SpringMVC工作流程概述
    SpringMVC工作流程概述 ... [详细]
  • ps:写的第一个,不足之处,欢迎拍砖---只是想用自己的方法一步步去实现一些框架看似高大上的小功能(比如说模型中的toArraytoJsonsetAtt ... [详细]
  • 在tp5项目中引入ueditor编辑器并实例化后插入图片出现目录创建失败问题在查看网络上各种解决方案之后总结如下:根据官网提示主要是因为图片保存的路径无权限导致,官方文档链接:ht ... [详细]
author-avatar
书友47721235_104
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有