json格式化BigDecimal,保留2位小数

场景

如下,在处理钱相关的业务时,接口明明已经保留了两位小数1.00,但前端接收的时候获取的却是1,小数点后面的‘0’没了。

@Data
public class UserVo {

    long id;
    
    String name;
    
    BigDecimal money;

}

其实,需要在BigDecimal参与json转化时,将其转化成String类型即可

一. Jackson的处理方式

1.编写一个类,实现JsonSerializer,并实现serialize方法

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.math.BigDecimal;

public class BigDecimalSerialize extends JsonSerializer{

    @Override
    public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        if(o != null && o instanceof BigDecimal){
            BigDecimal bigDecomal = (BigDecimal) o;
            jsonGenerator.writeString(bigDecomal.setScale(2,BigDecimal.ROUND_DOWN)+"");
        }
    }
}

2.在需要特殊处理的属性上加上这个注解@JsonSerialize,并将第一步创建好的类名加到参数中

@JsonSerialize(using = BigDecimalSerialize.class)
BigDecimal money;
  • 以下是在测试类中测试的场景
@Test
    public void jacksonFormat() throws JsonProcessingException {
        UserVo userVo = new UserVo();
        userVo.setMoney(new BigDecimal(1.000));
        ObjectMapper mapper = new ObjectMapper();
        String result=mapper.writeValueAsString(userVo);
        System.out.println("result = " + result);
    }
  • 看下测试结果,成功保留了对应的小数位数,并帮我们转成了String类型,很完美

json格式化BigDecimal,保留2位小数_第1张图片

二. FastJson的处理方式

1.编写一个类,实现ValueFilter,并实现process方法

import com.alibaba.fastjson.serializer.ValueFilter;
import java.math.BigDecimal;

public class BigDecimalValueFilter implements ValueFilter {
	@Override
    public Object process(Object object,String name,Object value){
        if(null != value&&value instanceof BigDecimal){
            BigDecimal bigDecimal = (BigDecimal) value;
            return bigDecimal.setScale(5,BigDecimal.ROUND_DOWN).toString();
        }
        return value;
    }
}

2.使用的时候需要在后面加上我们自定义的的类对象,如下


JSON.parseObject(JSON.toJSONString(userVo, new BigDecimalValueFilter()))
  • 同样测试下看看效果如何
@Test
    public void fastJsonFormat(){
        UserVo userVo = new UserVo();
        userVo.setMoney(new BigDecimal(1.000));
        JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(userVo, new BigDecimalValueFilter()));
        System.out.println("jsonObject = " + jsonObject);
    }
  • 打印结果

在这里插入图片描述

你可能感兴趣的:(java进阶,json,java,开发语言)