返回顶部
首页 > 资讯 > 后端开发 > Python >springboot @JsonSerialize的使用讲解
  • 208
分享到

springboot @JsonSerialize的使用讲解

2024-04-02 19:04:59 208人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录@JSONSerialize的使用讲解1.写一个类继承jsonSerializer 抽象类2.然后在传输的实体类中的属性上3.附加:还有一个比较好用的注解4.附加:之前附件3的注

@JsonSerialize的使用讲解

解决前端显示和后台存储数据单位不一致的问题。

在返回对象时,进行自定义数据格式转换。

1.写一个类继承JsonSerializer 抽象类

实现其serialize()方法,然后在方法中写入转换规则即可

举例是把Date时间戳从 毫秒 转换成 秒 为单位


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;
 

public class Date2LongSerializer extends JsonSerializer<Date> {
    @Override
    public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeNumber(date.getTime() / 1000);
    }
}

2.然后在传输的实体类中的属性上

打上@JsonSerialize注解即可


import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.ls.sell.enums.OrderStatusEnum;
import com.ls.sell.enums.PayStatusEnum;
import com.ls.sell.util.serializer.Date2LongSerializer;
import lombok.Data;
import org.hibernate.annotations.DynamicUpdate; 
import javax.persistence.Entity;
import javax.persistence.Id;
import java.math.BigDecimal;
import java.util.Date;
 

@Entity
@Data
@DynamicUpdate
public class OrderMaster { 
    @Id
    private String orderId; 
    private String buyerName; 
    private String buyerPhone; 
    private String buyerAddress; 
    private String buyerOpenid; 
    private BigDecimal orderAmount;
 
    
    private Integer orderStatus = OrderStatusEnum.NEW.getCode(); 
    
    private Integer payStatus = PayStatusEnum.WaiT.getCode(); 
    @JsonSerialize(using = Date2LongSerializer.class)
    private Date createTime; 
    @JsonSerialize(using = Date2LongSerializer.class)
    private Date updateTime;
}

3.附加:还有一个比较好用的注解

如果返回对象中变量存在null,可以使用@JsonInclude(JsonInclude.Include.NON_NULL)注解来忽略为null的变量,这样前端比较好处理


package com.ls.sell.dto; 
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.ls.sell.entity.OrderDetail;
import com.ls.sell.entity.OrderMaster;
import lombok.Data; 
import java.util.List;
 

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class OrderDTO extends OrderMaster {
    private List<OrderDetail> orderDetailList;
}

使用注解之前的返回值:

使用注解之后:

还是比较好用的。

4.附加:之前附件3的注解,还是有个问题

如果一个一个实体类配置的话,未免太过麻烦,所以可以在配置文件中直接配置,yml配置文件如下:

@JsonSerialize 相关使用(jsonUtil)

基础注解使用

1、实现JsonSerializer接口

例:


public class MySerializerUtils extends JsonSerializer<Integer> {
    @Override
    public void serialize(Integer status, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
        String statusStr = "";
         switch (status) {
             case 0:
                 statusStr = "新建状态";
                 break;
                 }
                 jsonGenerator.writeString(statusStr);
     }
 }

2、添加注解

注:@JsonSerialize注解,主要应用于数据转换,该注解作用在该属性的getter()方法上。

①用在属性上(自定义的例子)


@JsonSerialize(using = MySerializerUtils.class)
private int status;

②用在属性上(jackson自带的用法)


@JsonFORMat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    @JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime sendTime;

③用在空对象上可以转化


@JsonSerialize
public class XxxxxBody {
 // 该对象暂无字段,直接new了返回
}

框架层面的使用

jsonUtil工具

实现json转换时所有的null转为“”

1、实现JsonSerializer类


public class CustomizeNullJsonSerializer {
    public static class NullStringJsonSerializer extends JsonSerializer<Object> {
        @Override
        public void serialize(Object value, JsonGenerator jsonGenerator,
                              SerializerProvider serializerProvider) throws IOException {
            jsonGenerator.writeString("");
        }
    }
}

2、实现BeanSerializerModifier类


public class CustomizeBeanSerializerModifier extends BeanSerializerModifier {
    @Override
    public List<BeanPropertyWriter> changeProperties(SerializationConfig config,
                                                     BeanDescription beanDesc,
                                                     List<BeanPropertyWriter> beanProperties) {
        for (int i = 0; i < beanProperties.size(); i++) {
            BeanPropertyWriter writer = beanProperties.get(i);
            if (isStringType(writer)) {
                writer.assignNullSerializer(new CustomizeNullJsonSerializer.NullStringJsonSerializer());
            }
        }
        return beanProperties;
    }
    
    private boolean isStringType(BeanPropertyWriter writer) {
        Class<?> clazz = writer.getType().getRawClass();
        return CharSequence.class.isAssignableFrom(clazz) || Character.class.isAssignableFrom(clazz);
    }
}

3、工具类调用


public class JsonUtil {
//序列化时String 为null时变成""
    private static ObjectMapper mapperContainEmpty = new ObjectMapper();
static {
        mapperContainEmpty.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        mapperContainEmpty.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapperContainEmpty.setSerializerFactory(mapperContainEmpty.getSerializerFactory()
                .withSerializerModifier(new CustomizeBeanSerializerModifier()));
    }
 
    public static String toJsonContainEmpty(Object o) {
        try {
            return mapperContainEmpty.writeValueAsString(o);
        } catch (IOException e) {
            logger.error("render object to json error: {}", e.getMessage(), e);
            throw new RuntimeException("render object to json error!", e);
        }
    }
}

附:jsonUtil完整代码



public class JsonUtil {
    private static Logger logger = LoggerFactory.getLogger(JsonUtil.class);
    private static ObjectMapper mapper = new ObjectMapper();
    //序列化时String 为null时变成""
    private static ObjectMapper mapperContainEmpty = new ObjectMapper();
    static {
        mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapper.setSerializationInclusion(Include.NON_NULL);
        mapperContainEmpty.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        mapperContainEmpty.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapperContainEmpty.setSerializerFactory(mapperContainEmpty.getSerializerFactory()
                .withSerializerModifier(new CustomizeBeanSerializerModifier()));
    }
    
    public static String toJson(Object o) {
        try {
            return mapper.writeValueAsString(o);
        } catch (IOException e) {
            logger.error("render object to json error: {}", e.getMessage(), e);
            throw new RuntimeException("render object to json error!", e);
        }
    }
    
    public static String toJsonContainEmpty(Object o) {
        try {
            return mapperContainEmpty.writeValueAsString(o);
        } catch (IOException e) {
            logger.error("render object to json error: {}", e.getMessage(), e);
            throw new RuntimeException("render object to json error!", e);
        }
    }
    
    public static <T> T toObject(String json, Class<T> clazz) {
        try {
            return mapper.readValue(json, clazz);
        } catch (IOException e) {
            logger.error("render json to object error: {}", e.getMessage(), e);
            throw new RuntimeException("render json to object error!", e);
        }
    }
    
    public static <T> List<T> toList(String json, Class<T> clazz) {
        try {
            JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, clazz);
            return mapper.readValue(json, javaType);
        } catch (IOException e) {
            logger.error("render json to List<T> error: {}", e.getMessage(), e);
            throw new RuntimeException("render json to List<T> error!", e);
        }
    }
    
    public static <K, V> Map<K, V> toMap(String json, Class<K> clazzKey, Class<V> clazzValue) {
        try {
            JavaType javaType = mapper.getTypeFactory().constructParametricType(Map.class, clazzKey, clazzValue);
            return mapper.readValue(json, javaType);
        } catch (IOException e) {
            logger.error("render json to Map<K, V> error: {}", e.getMessage(), e);
            throw new RuntimeException("render json to Map<K, V> error!", e);
        }
    }
}

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

--结束END--

本文标题: springboot @JsonSerialize的使用讲解

本文链接: https://lsjlt.com/news/137877.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • springboot @JsonSerialize的使用讲解
    目录@JsonSerialize的使用讲解1.写一个类继承JsonSerializer 抽象类2.然后在传输的实体类中的属性上3.附加:还有一个比较好用的注解4.附加:之前附件3的注...
    99+
    2024-04-02
  • SpringBoot使用Swagger范例讲解
    目录1. Swagger 介绍2. 使用Swagger接口文档框架1. Swagger 介绍 在一个项目开发过程中,当前端开发人员根据后端开发人员给出的 API 接口文档进行接口联调...
    99+
    2024-04-02
  • 基于@JsonSerialize和@JsonInclude注解使用方法
    目录@JsonSerialize和@JsonInclude注解@JsonSerialize使用步骤@JsonIncludeJSON @JsonSerialize 弃用问题解决方案@J...
    99+
    2024-04-02
  • @JsonSerialize不起作用的解决方案
    目录@JsonSerialize不起作用在项目中 当字段实体类为Long类型时但是这里有个小坑@JsonSerialize正确使用1. 写一个负责转换的类2. 在实体类上需要装换的字...
    99+
    2024-04-02
  • springBoot详细讲解使用mybaties案例
    首先创建springBoot项目,jdk选择1.8 然后倒入mybaties的相关依赖 我们用的springBoot,当然spring全家桶里面含有mybaties,所以我们直接使用...
    99+
    2024-04-02
  • Springboot深入讲解nocos的整合与使用
    目录前言1,  创建工程2,启动nacos-server服务3,编写controller进行动态配置生效4,添加配置文件boostrap.yaml5,nacos配置前言 N...
    99+
    2024-04-02
  • SpringBoot拦截器使用精讲
    目录定义拦截器注册拦截器指定拦截规则实现登陆功能验证登陆及登陆拦截功能我们对拦截器并不陌生,无论是 Struts 2 还是 Spring MVC 中都提供了拦截器功能,它可以根据 U...
    99+
    2024-04-02
  • SpringBoot图文并茂讲解Lombok库的安装与使用
    目录1.相关介绍2.安装步骤1.添加依赖2.安装插件3.使用注解1.相关介绍 Lombok是一个通过注解以达到减少代码的Java库,如通过注解的方式减少get,set方法,构造方法等...
    99+
    2024-04-02
  • 讲解springboot连接Redis的教程
    这篇文章主要介绍“讲解springboot连接Redis的教程”,在日常操作中,相信很多人在讲解springboot连接Redis的教程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”讲解springboot连...
    99+
    2023-06-06
  • SpringBoot使用GraphQL开发WebAPI实现方案示例讲解
    目录前言Spring Boot中GraphQL的实现方案前言 传统的Restful API 存在诸多的问题,首先它无法控制返回的字段,前端也无法预判后端的返回结果,另外不同的返回结果...
    99+
    2023-05-14
    SpringBoot GraphQL开发Web API SpringBoot Web API
  • SpringBoot超详细讲解@Value注解
    目录一、非配置文件注入1、注入普通字符串2、注入JAVA系统变量3、注入表达式4、注入其他Bean属性5、注入文件资源6、注入URL资源二、通过配置文件注入1、注入普通字符串2、注入...
    99+
    2024-04-02
  • SpringBoot详细讲解yaml配置文件的用法
    目录1.基本语法2.数据类型3.代码测试4.开启补全提示1.基本语法 key: value;kv之间有空格大小写敏感使用缩进表示层级关系缩进不允许使用tab,只允许空格缩进的空格数不...
    99+
    2024-04-02
  • springboot中的多个application文件讲解
    目录springboot多个application文件1、创建生产和测试文件如下2、application.properties配置如下springboot拆分application...
    99+
    2024-04-02
  • java中Unsafe的使用讲解
    目录1.获取unsafe2.获取unsafe前段时间因为看JUC的源码,里面有大量关于unsafe的操作,所以就来看看了.写点笔记总结下(本文基于jdk1.8): unsafe可以帮...
    99+
    2024-04-02
  • SpringBoot复杂参数应用详细讲解
    复杂参数: Map<String, Object> mapModel modelHttpServletRequest requestHttpServletResponse...
    99+
    2024-04-02
  • 如何用SpringBoot整合Redis(详细讲解~)
    大家好,我是卷心菜。本篇主要讲解用SpringBoot整合Redis,如果您看完文章有所收获,可以三连支持博主哦~,嘻嘻。 文章目录 一、前言二、基本介绍三、SpringDataRedis四、API的简单认识五、快速入门1、引入...
    99+
    2023-08-20
    redis spring boot java
  • SpringBoot入口类和@SpringBootApplication讲解
    目录入口类和@SpringBootApplication@ComponentScan相关使用@EnableAutoConfiguration关闭自动配置为什么是SpringBootS...
    99+
    2024-04-02
  • Java Timer使用讲解
    目录Timer 详解定时功能一、一次性任务二、可重复执行任务三、固定延时和固定速率区别(重点)1. 介绍2. 固定速率3. 固定延时4. 其他要点四、调度多个TimerTa...
    99+
    2022-11-13
    Java Timer使用 Java Timer
  • SpringBoot详解Banner的使用
    Banner的设置方式有以下几种 1、默认:SpringBoot + 版本号; 2、添加自定义资源文件:banner.txt; 3、添加自定义资源文件:banner.jpg/png/...
    99+
    2024-04-02
  • springboot-controller的使用详解
    Controller的使用一、 @Controller:处理http请求 @RestController:Spring4之后新加的注解,原来返回json需要@ResponseBody配合@Controller @RequestMapp...
    99+
    2023-05-31
    spring boot controller
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作