jackson自定义序列化反序列化

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

jackson自定义序列化和反序列化

自定义序列化
  • 序列化主要作用在返回数据的时候
  • 以BigDecimal统一返回3位小数为例
  • 自定义序列化处理类
  • 继承jackson的JsonSerializer类,重写serialize方法
/**
 * @author liouwb
 */
public class BigDecimalSerializer extends JsonSerializer<BigDecimal> {
    @Override
    public void serialize(BigDecimal value, JsonGenerator jsonGenerator, SerializerProvider serializers) throws IOException {
        jsonGenerator.writeString(formatBigDecimal(value));
    }

    /**
     * 保留3位小数
     */
    private String formatBigDecimal(BigDecimal value) {
        if (Objects.nonNull(value) && value.compareTo(BigDecimal.ZERO) >= 0) {
            DecimalFormat df = new DecimalFormat();
            df.applyPattern("0.000");
            return df.format(value);
        }

        return null;
    }
}
  • 使用的时候,可以直接使用Jackson的@JsonSerialize注解
    @JsonSerialize(using = BigDecimalSerializer.class)
    private BigDecimal amount;
自定义反序列化
  • 接收前端传入数据
  • 继承JsonDeserializer类,重写deserialize方法
  • 例子:后端传入前端的图片链接,去掉域名,只保存path部分
/**
 * @author liouwb
 */
public class StaticUrlDeserialize extends JsonDeserializer<String> {

    @Override
    public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        // 前端传入数据
        String text = jsonParser.getText();
        // 域名前缀
        String domain = "https://domain/";
        // 去掉域名保留path
        String path = text.replace(domain, "");
        return path;
    }
}
  • 使用的时候,可以直接使用Jackson的@JsonDeserialize注解
    @ApiModelProperty(value = "用户头像", position = 6)
    @JsonDeserialize(using = StaticUrlDeserialize.class)
    private String avatar;
统一配置自定义序列化、反序列化
  • 也可以使用全局统一配置
  • 统一处理BigDecimal返回格式和日期
/**
 * @author liouwb
 */
@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper ObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule simpleModule = new SimpleModule();
        // 自定义序列化BigDecimal
        simpleModule.addSerializer(BigDecimal.class, new BigDecimalSerializer());
        // 自定义日期的序列化和反序列化
        simpleModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        simpleModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        simpleModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
        simpleModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        simpleModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        simpleModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
        objectMapper.registerModule(simpleModule);

        return objectMapper;
    }
}

文章来源地址https://www.toymoban.com/news/detail-636180.html

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

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

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

相关文章

  • Springboot Jackson 序列化与反序列化配置

    可解决在使用默认反序列化Jackson时,LocalDateTime类型的请求参数反序列化失败的问题

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

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

    2024年01月18日
    浏览(26)
  • JackSon反序列化通杀

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

    2024年04月12日
    浏览(21)
  • 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日
    浏览(39)
  • Jackson序列化Bean额外属性附加--@JsonAnyGetter、@JsonUnwrapped用户

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

    2024年01月24日
    浏览(51)
  • Jackson-databind 反序列化漏洞(CVE-2017-7525、CVE-2017-17485)

    Jackson-databind 支持 Polymorphic Deserialization 特性(默认情况下不开启),当 json 字符串转换的 Target class 中有 polymorph fields,即字段类型为接口、抽象类或 Object 类型时,攻击者可以通过在 json 字符串中指定变量的具体类型 (子类或接口实现类),来实现实例化指定的类,借助某些特

    2024年02月13日
    浏览(26)
  • springboot对象序列化自定义序列化注解

    在开发中有时候会遇到一些内容返回时需要翻译,或者一些内容在序列化之前需要特殊处理(脱敏啥的)。 一般对单个属性可以直接用 jackson 的序列化注解对某个属性单独处理 com.fasterxml.jackson.databind.annotation.JsonSerialize(using= xxx.class) 但是直接使用不太灵活,可以进一步引入注

    2024年02月07日
    浏览(38)
  • 【Linux】自定义协议+序列化+反序列化

    喜欢的点赞,收藏,关注一下把! 协议是一种 “约定”。在前面我们说过父亲和儿子约定打电话的例子,不过这是感性的认识,今天我们理性的认识一下协议。 socket api的接口, 在读写数据时,都是按 “字符串”(其实TCP是字节流,这里是为了理解) 的方式来发送接收的。如

    2024年04月08日
    浏览(30)
  • jackjson自定义序列化和反序列化

    JRT引用的jackjson作为json处理库。由于JRT.ORM要求表不用datetime类型,把日期和时间用Int存储,所以ORM要支持日期时间的转换。为什么要把日期时间不用datetime而用Int,比如日期:20240117,时间就是从0点到当前的秒数。因为不用datetime兼容性好,不会因为不同库datetime函数不同而要

    2024年01月18日
    浏览(26)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包