首页 > 其他分享 >定制JSON序列化的利器示例

定制JSON序列化的利器示例

时间:2024-09-02 18:14:26浏览次数:9  
标签:java jackson 示例 JSON import 序列化 com annotation fasterxml

金额序列化:

import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.rb.jrzl2.crm.infrastructure.constant.json.deserializer.BigDecimalDeserializer;
import com.rb.jrzl2.crm.infrastructure.constant.json.serializer.BigDecimalSerializer;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.math.RoundingMode;

@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = BigDecimalSerializer.class)
@JsonDeserialize(using = BigDecimalDeserializer.class)
@Target(ElementType.FIELD)
public @interface BigDecimalFormat {
    /**
     * 功能描述:
     * 参考DecimalFormat
     */
    String value() default "";

    boolean showPlusAndMinus() default false;

    RoundingMode roundingMode() default RoundingMode.HALF_UP;
}

 

序列化:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import com.rb.jrzl2.crm.infrastructure.constant.json.annotation.BigDecimalFormat;

import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;


public class BigDecimalSerializer extends JsonSerializer<BigDecimal> implements ContextualSerializer {
    private String pattern;
    private RoundingMode roundingMode = RoundingMode.HALF_UP;
    private boolean showPlusAndMinus;

    @Override
    public void serialize(BigDecimal value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
        DecimalFormat decimalFormat = new DecimalFormat(pattern);
        decimalFormat.setRoundingMode(roundingMode);
        if (showPlusAndMinus) {
            decimalFormat.setNegativePrefix("-");
            decimalFormat.setPositivePrefix("+");
        }
        if (value == null) {
            jgen.writeString("");
        } else {
            jgen.writeString(decimalFormat.format(value));
        }
    }

    @Override
    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
        if (property == null) {
            return prov.findNullValueSerializer(property);
        }
        BigDecimalFormat annotation = property.getAnnotation(BigDecimalFormat.class);
        if (annotation == null) {
            annotation = property.getContextAnnotation(BigDecimalFormat.class);
        }
        this.pattern = annotation.value();
        this.roundingMode = annotation.roundingMode();
        this.showPlusAndMinus = annotation.showPlusAndMinus();
        return this;
    }
}

 

反序列化:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.deser.ContextualDeserializer;
import com.rb.jrzl2.crm.infrastructure.constant.json.annotation.BigDecimalFormat;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.ParseException;

@Slf4j
public class BigDecimalDeserializer extends JsonDeserializer<BigDecimal> implements ContextualDeserializer {
    private String pattern;
    private RoundingMode roundingMode = RoundingMode.HALF_UP;

    @Override
    public BigDecimal deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        DecimalFormat decimalFormat = new DecimalFormat(pattern);
        decimalFormat.setRoundingMode(roundingMode);
        decimalFormat.setParseBigDecimal(true);
        try {
            Number parse = decimalFormat.parse(p.getValueAsString());
            return new BigDecimal(parse.toString());
        } catch (ParseException e) {
            log.error("金额解析异常", e);
        }
        String valueAsString = p.getValueAsString();
        return new BigDecimal(valueAsString);
    }

    @Override
    public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException {
        if (property == null) {
            return this;
        }
        final BigDecimalFormat annotation = property.getAnnotation(BigDecimalFormat.class);
        if (annotation == null) {
            return this;
        }
        this.pattern = annotation.value();
        this.roundingMode = annotation.roundingMode();
        return this;
    }
}

 

标签:java,jackson,示例,JSON,import,序列化,com,annotation,fasterxml
From: https://www.cnblogs.com/xiejn/p/18393242

相关文章

  • java定义通用返回结果类ResultVO使用示例详解
    java定义通用返回结果类ResultVO使用示例详解定义通用返回结果类定义ResultVO类,作返回给前端的对象结构,主要有4个字段code:错误码data:内容message:消息description:具体描述importlombok.Data;importjava.io.Serializable;/***通用返回结果类*@param<T>*/@D......
  • NuGet配置文件nuget.config的应用示例
    参考:https://learn.microsoft.com/zh-cn/nuget/consume-packages/configuring-nuget-behavior创建新配置文件使用.NETCLI运行  dotnetnewnugetconfig ,创建默认nuget.config。有关详细信息,请参阅dotnetCLI命令。也可以将下方的模板手动复制到新文件中,然后使用......
  • nginx的基本使用示例(负载均衡,虚拟主机,动静分离)的详细配置过程
    文章目录前言前置工作httpd主机tomcat主机nginx主机配置负载均衡配置过程效果展示虚拟主机配置过程效果展示动静分离配置过程排除思路前言本篇博客展示nginx的基本使用案例,后端由httpd+tomcat组成,linux版本:rocky9.2虚拟机ipnginx192.168.10.11httpd192.168......
  • 【vue、react】前端如何为package.json添加注释
    文章目录前言安装使用方法问题前言写了个项目,想给package.json加注释结果发现加不上去,就在网上查找了相关文章,特意总结记录一下,防止下次使用。参考文章:如何为package.json添加注释众所周知,JSON文件是不支持注释的,除了JSON5/JSONC之外,我们在开发项目特别是前端项目......
  • 添加到MySQL中的json
    要将JSON数据添加到MySQL中,你可以使用MySQL提供的JSON数据类型。以下是一般的步骤:确保你的MySQL版本支持JSON数据类型。JSON数据类型在MySQL5.7及更高版本中可用。创建表时,将包含JSON数据的列定义为JSON类型。例如:CREATETABLEyour_table(idINTPRIMARY......
  • 常见的数据交换格式:JSON、Proto、XML和YAML
    原创控制工程研习proto、json、xml和yaml是四种常见的数据交换格式,它们的全称分别是:ProtocolBuffers(Proto)、JSON(JavaScriptObjectNotation)、XML(ExtensibleMarkupLanguage)和YAML(YAMLAin'tMarkupLanguage)。ProtocolBuffers(Proto)ProtocolBuffers......
  • Jsoncpp的安装与使用
    目录安装JsoncppJsoncpp的使用Value类构造函数检测保存的数据类型提取数据对json数组的操作对Json对象的操作 FastWriter类 Reader类JsonCpp是一个C++库,用于解析和生成JSON数据。它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式。安装Jsonc......
  • File类,递归,字符集,IO流(字节流,字符流,缓冲流,转换流,转换流,序列化流,释放资源的方式)
    目录一、File类二、递归三、字符集四、IO流1.概述2.字节流3.字符流4.缓冲流5.转换流6.打印流7.数据流8.序列化流9.释放资源的方式一、File类File是java.io.包下的类,File类的对象,用于代表当前操作系统的文件(可以是文件、或文件夹)。注意:File类只能对文件本身进行操......
  • ROS 入门-如何在Ubuntu系统中安装不同版本的ROS并编写基本示例
    引言在当今快速发展的科技时代,机器人技术正以前所未有的速度改变着我们的生活。从工业生产线上的自动化装配,到家庭中的智能助手,再到医疗领域的精密手术,机器人无处不在。然而,随着机器人应用范围的不断扩展,如何高效地开发和部署复杂的机器人系统成为了亟待解决的问题。正是在......
  • 正点原子Linux Framebuffer编程:解决示例程序在开发板上LCD显示错位和颜色异常
    正点原子LinuxFramebuffer编程:解决示例程序在开发板上运行7寸LCD显示错位和颜色异常作者在学习【正点原子】I.MX6U嵌入式LinuxC应用编程指南V1.4时,发现其配套的程序在开发板上运行不正常。使用的硬件版本:正点原子I.MX6UALPHAV2.4版本底板,LCD:正点原子7寸1024*600,型号ATK-MD0......