SpringBoot @JsonDeserialize自定义Json序列化方式

目录
  • @JsonDeserialize自定义Json序列化
    • 1.问题
    • 2.现象
    • 3.解决办法
  • @JsonSerialize与@JsonDeserialize使用
    • 1.以注解方式使用
    • 2.自定义实现类

@JsonDeserialize自定义Json序列化

1.问题

在项目上使用SpringBoot为框架,调用第三方接口时,返回的参数Date类型,需要自定义进行Json序列化,需要进行处理,接受数据

2.现象

调用第三方接口,返回参数类型为Date类型,格式如下:

{
    "created": "2018-12-27 16:15:25",
    "lastupd": "2018-12-27 08:25:48"
}

返回Date类型数据格式为:yyyy-MM-dd HH:mm:ss,Json默认序列化Date类型参数,格式为:yyyy-MM-dd HH:mm:ss.SSS,则需要自定义进行系列化

3.解决办法

创建接收数据对象,生成Get\Set方法:,在Set方法上,加上@JsonDeserialize注解,如下:

 public class TestDto implements Serializable {
    /**
     * 生成时间
     *
     */
    private Date created;
    /**
     * LastUpd
     *
     */
    private Date lastUpd;
​
    public Date getCreated() {
        return created;
    }
    @JsonDeserialize(using = CustomJsonDateDeserializer.class)
    public void setCreated(Date created) {
        this.created = created;
    }
    public Date getLastUpd() {
        return lastUpd;
    }
    @JsonDeserialize(using = CustomJsonDateDeserializer.class)
    public void setLastUpd(Date lastUpd) {
        this.lastUpd = lastUpd;
    }
 }

在进行自定义序列化时,加上 @JsonDeserialize(using = CustomJsonDateDeserializer.class)注解,

其中@JsonDeserialize,表示告诉SpringBoot,当前属性进行自定义系列化,则SpringBoot进行序列化时,将会跳过这个参数

CustomJsonDateDeserializer.class为自定义序列化对象,如下:

package com.test;​
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
​
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
​
/**
 * 自定义序列化
 **/
public class CustomJsonDateDeserializer extends JsonDeserializer<Date> {
​
    @Override
    public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date = jp.getText();
        try {
            return format.parse(date);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
}

以上,接受数据时,会自定义进行Json序列化,接收Date格式的数据。

@JsonSerialize与@JsonDeserialize使用

1.以注解方式使用

@JsonDeserialize(using= DateJsonDeserializer.class)
@JsonSerialize(using= DateJsonSerializer.class)
private Date time;

2.自定义实现类

public class DateJsonDeserializer extends JsonDeserializer<Date>
{
    public static final SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    @Override
    public Date deserialize(com.fasterxml.jackson.core.JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, com.fasterxml.jackson.core.JsonProcessingException {

        try
        {
            if(jsonParser!=null&&StringUtils.isNotEmpty(jsonParser.getText())){
                return format.parse(jsonParser.getText());
            }else {
                return null;
            }

        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
            throw new RuntimeException(e);
        }
    }
}
public class DateJsonSerializer extends JsonSerializer<Date> {
    public static final SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
    public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeString(format.format(date));
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 彻底解决Spring mvc中时间的转换和序列化等问题

    痛点 在使用Spring mvc 进行开发时我们经常遇到前端传来的某种格式的时间字符串无法用java8的新特性java.time包下的具体类型参数来直接接收. 我们使用含有java.time封装类型的参数接收也会报反序列化问题,在返回前端带时间类型的同样会出现一些格式化的问题.今天我们来彻底解决他们. 建议 其实最科学的建议统一使用时间戳来代表时间.这个是最完美的,避免了前端浏览器的兼容性问题,同时也避免了其它一些中间件的序列化/反序列化问题.但是用时间表达可能更清晰语义化.两种方式各有千秋,如

  • 关于Springboot日期时间格式化处理方式总结

    项目中使用LocalDateTime系列作为DTO中时间的数据类型,但是SpringMVC收到参数后总报错,为了配置全局时间类型转换,尝试了如下处理方式. 注:本文基于Springboot2.x测试,如果无法生效可能是spring版本较低导致的.PS:如果你的Controller中的LocalDate类型的参数啥注解(RequestParam.PathVariable等)都没加,也是会出错的,因为默认情况下,解析这种参数是使用ModelAttributeMethodProcessor进行处理,而

  • SpringBoot Redis配置Fastjson进行序列化和反序列化实现

    FastJson是阿里开源的一个高性能的JSON框架,FastJson数据处理速度快,无论序列化(把JavaBean对象转化成Json格式的字符串)和反序列化(把JSON格式的字符串转化为Java Bean对象),都是当之无愧的fast:功能强大(支持普通JDK类,包括javaBean, Collection, Date 或者enum):零依赖(没有依赖其他的任何类库). 1.写一个自定义序列化类 /** * 自定义序列化类 * @param <T> */ public class FastJ

  • springboot json时间格式化处理的方法

    application.properties中加入如下代码 springboot 默认使用 jackson 解析 json spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zone=GMT+8 如果个别实体需要使用其他格式的 pattern,在实体上加入注解即可 import org.springframework.format.annotation.DateTimeFormat; import com.fas

  • SpringBoot @JsonDeserialize自定义Json序列化方式

    目录 @JsonDeserialize自定义Json序列化 1.问题 2.现象 3.解决办法 @JsonSerialize与@JsonDeserialize使用 1.以注解方式使用 2.自定义实现类 @JsonDeserialize自定义Json序列化 1.问题 在项目上使用SpringBoot为框架,调用第三方接口时,返回的参数Date类型,需要自定义进行Json序列化,需要进行处理,接受数据 2.现象 调用第三方接口,返回参数类型为Date类型,格式如下: { "created":

  • golang如何自定义json序列化应用详解

    前言 Go语言作为一个由Google开发,号称互联网的C语言的语言,自然也对JSON格式支持很好.下面这篇文章主要介绍了关于golang自定义json序列化应用的相关内容,下面话不多说了,来一起看看详细的介绍吧 问题引入 当某个struct存在某个字段为string或者[]byte类型但是实际上保存的内容是json格式的数据时,对其进行json序列化,比如 type Message struct { From string `json:"from"` To string `json:&

  • SpringBoot使用自定义json解析器的使用方法

    Spring-Boot是基于Spring框架的,它并不是对Spring框架的功能增强,而是对Spring的一种快速构建的方式. Spring-boot应用程序提供了默认的json转换器,为Jackson.示例: pom.xml中dependency配置: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  • SpringBoot多种自定义错误页面方式小结

    目录 以前web.xml方式 SpringBoot中实现方式 1.实现EmbeddedServletContainerCustomizer的bean 2.通过拦截器方式 3.自定义静态error页面方法 在项目中为了友好化,对于错误页面,我们常常会使用自定义的页面.SSM框架组合时代,我们通常通过拦截或者在web.xml中设置对于错误码的错误页面,然而到了SpringBoot,web.xml消失了,SpringBootServletInitializer初始化servlet代替了web.xml.

  • SpringBoot之自定义Schema扩展方式

    目录 SpringBoot 自定义Schema扩展 1. 配置ServiceConfig属性 2. 编写XSD文件 3. 编写NamespaceHandler 4. 编写BeanDefinitionParser 5. 配置spring.handlers和spring.schemas 6. 配置spring的加载文件 7. 测试 Spring Schema扩展机制 1. 概述 2. 步骤 3. 示例如下 SpringBoot 自定义Schema扩展 最近在写RPC框架时,用到了自定义的xsd配置.

  • SpringBoot 如何实现自定义Redis序列化

    目录 问题 环境 入口点 实现自定义序列化 小结 问题 在使用RedisTemplate存储对象时,如果采用JDK默认的序列化方式,数据会出现许多编码字符,辨析度不高.比如一个空的User对象,存储到redis后如下: 这些使用JDK默认序列化方式序列化后的数据简直惨不忍睹,在使用命令行查询数据时会很头疼. 如何使数据更容易辨别呢? 一种办法是使用StringRedisTemplate,在存入redis前先将数据处理成字符串格式再存入redis,但这种方式的缺点就是每次存入数据前都要手动对非字符

  • SpringBoot整合redis中的JSON序列化文件夹操作小结

    目录 前言 快速配置 JSON序列化 jackson序列化 Fastjson序列化 分析参考对比 更多问题参考 redis数据库操作 前言 最近在开发项目,用到了redis作为缓存,来提高系统访问速度和缓解系统压力,提高用户响应和访问速度,这里遇到几个问题做一下总结和整理 快速配置 SpringBoot整合redis有专门的场景启动器整合起来还是非常方便的 <dependency> <groupId>org.springframework.boot</groupId>

  • 如何自定义Jackson序列化 @JsonSerialize

    目录 自定义Jackson序列化 @JsonSerialize jackson自定义全局序列化.反序列化 创建序列化类 创建反序列化类 将两个类注册进入jackson核心对象objectMapper 小结一下 自定义Jackson序列化 @JsonSerialize 自定义json序列化需要实现StdSerializer<T>或者JsonSerializer<T>. 我要序列化House这个类,加上注解,指定用于序列化的类 package com.xhx.json.entity;

  • JSON序列化导致Long类型被搞成Integer的坑及解决

    目录 JSON序列化导致Long类型被搞成Integer的坑 上代码 方案 思考 JSON格式转int/long报错 Gson转换导致int转换成double的问题 JSON序列化导致Long类型被搞成Integer的坑 最近遇到一个错误,就是某个字段肯定是Long类型的,通过Map<String,Object>方式转成JSON字符串,然后存到了DB的某个字段里. 为了Json存储字,然后反序列化为Map(不是自定义的常规对象) 比如某二方为了提供通用的接口能力,将Map<String,

  • SpringDataRedis入门和序列化方式解决内存占用问题小结

    目录 spring-data-redis简介 spring-data-redis的特性 基本介绍 实例Demo 自定义RedisTemplate序列化 自定义的RestTemplate的内存占用问题 StringRedisTemplate解决内存占用问题 总结 spring-data-redis简介 spring-data-redis是spring-data模块的一部分,专门用来支持在spring管理项目对redis的操作,使用java操作redis最常用的是使用jedis,但并不是只有jedi

随机推荐