springboot使用默认的jackson在序列化实体为json字符串时的问题,
属性名只有大小写差异时,后面的会被忽略
public static void main(String[] args) throws JsonProcessingException {
TestVO testVO = new TestVO();
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(testVO));
}
@Getter
@Setter
@ToString
public static class TestVO{
//@JsonProperty("gNo")
private String gnO = "gnO";
private String gNo = "gNo";
private String gnoA = "gnoA";
private String gnOA = "gnOA";
private String gNO1o = "gNO1o";
private String gNO1O = "gNO1O";
//@JsonSerialize(using = DoubleJsonSerialize.class)
private Double qty = 1.0;
private Double qTy1 = 1.00;
private Double qTY1 = 1.000;
}
结果
{"gnO":"gnO","gnoA":"gnoA","qty":1.0,"qty1":1.0,"gno1o":"gNO1o"}
首字母小写而第二个字母开始大写时,会序列化为全小写的key
且中间的数字不会影响
@Getter
@Setter
@ToString
public static class TestVO{
//@JsonProperty("gNo")
private String gNo = "gNo";
private String gnO = "gnO";
private String gnoA = "gnoA";
private String gnOA = "gnOA";
private String gNO1o = "gNO1o";
private String gNO1O = "gNO1O";
//@JsonSerialize(using = DoubleJsonSerialize.class)
private Double qty = 1.0;
private Double qTY1 = 1.000;
private Double qTy1 = 1.00;
}
结果:{"gnoA":"gnoA","qty":1.0,"gno":"gNo","gno1o":"gNO1o","qty1":1.0}
使用@JsonProperty("")后 ,会按指定key名追加在后面
@Getter
@Setter
@ToString
public static class TestVO{
@JsonProperty("gNo")
private String gNo = "gNo";
private String gnO = "gnO";
private String gnoA = "gnoA";
private String gnOA = "gnOA";
private String gNO1o = "gNO1o";
private String gNO1O = "gNO1O";
//@JsonSerialize(using = DoubleJsonSerialize.class)
private Double qty = 1.0;
@JsonProperty("qTY1")
private Double qTY1 = 1.001;
private Double qTy1 = 1.00;
}
结果:{"gnoA":"gnoA","qty":1.0,"gno1o":"gNO1o","qty1":1.001,"gno":"gNo","gNo":"gNo","qTY1":1.001}
另外double类型带至少一位小数,可以通过@JsonSerialize()来处理,如下所示:
public static void main(String[] args) throws JsonProcessingException {
TestVO testVO = new TestVO();
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(testVO));
}
@Getter
@Setter
@ToString
public static class TestVO{
@JsonProperty("gNo")
private String gNo = "gNo";
private String gnO = "gnO";
private String gnoA = "gnoA";
private String gnOA = "gnOA";
private String gNO1o = "gNO1o";
private String gNO1O = "gNO1O";
@JsonSerialize(using = DoubleJsonSerialize.class)
private Double qty = 1d;
@JsonProperty("qTY1")
private Double qTY1 = 1d;
private Double qTy1 = 1.00;
}
结果:{"gnoA":"gnoA","qty":1,"gno1o":"gNO1o","qty1":1.0,"gno":"gNo","gNo":"gNo","qTY1":1.0}
DoubleJsonSerialize
/**
* 版权:taylor
* 描述: double序列化时的位数
* 创建时间:2020年07月24日
*/
package com.taylor.common.config;
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.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
/**
* 类用途:double序列化时的位数
*
* @author taylor
* @version [V1.0, 2020年07月24日]
* @since []
*/
public class DoubleJsonSerialize extends JsonSerializer<Double> {
/**5位小数*/
private DecimalFormat df = new DecimalFormat("0.#####");
@Override
public void serialize(Double value, JsonGenerator jgen,
SerializerProvider provider) throws IOException{
if(value != null) {
df.setMaximumFractionDigits(5);
///df.setGroupingSize(0);
df.setRoundingMode(RoundingMode.FLOOR);
//根据实际情况选择使用
// gen.writeString(df.format(value)); // 返回出去是字符串
jgen.writeNumber(df.format(value));
}
}
}