(七) - json处理 - Jackson 进阶
我们可以添加一些 Jackson 的注解来处理 Jackson 返回的 json 数据.
首先我们创建 JacksonData 类和相关 servlet, 如下所示, 再在此基础上进行实例说明.
JacksonData.java:
public class JacksonData { String jacksonName; String jacksonValue; Date jacksonDate; @Override public String toString() { return "JacksonData{" + "jacksonName='" + jacksonName + '\'' + ", jacksonValue='" + jacksonValue + '\'' + ", jacksonDate=" + jacksonDate + '}'; } public JacksonData(String jacksonName, String jacksonValue, Date jacksonDate) { this.jacksonName = jacksonName; this.jacksonValue = jacksonValue; this.jacksonDate = jacksonDate; } public JacksonData(){ } public Date getJacksonDate() { return jacksonDate; } public String getJacksonName() { return jacksonName; } public String getJacksonValue() { return jacksonValue; } public void setJacksonDate(Date jacksonDate) { this.jacksonDate = jacksonDate; } public void setJacksonName(String jacksonName) { this.jacksonName = jacksonName; } public void setJacksonValue(String jacksonValue) { this.jacksonValue = jacksonValue; } }
TestJackson.java:
@RequestMapping("/jackson") @RestController public class TestJackson { @RequestMapping("/test1") public JacksonData test1(){ System.out.println("test1"); JacksonData jacksonData = new JacksonData("name", "张三", new Date()); return jacksonData; } }
访问结果:(日期输出了毫秒数)
一. @JsonFormat
用户更改输出的 Date 类型数据的格式
在 JacksonData.java 中为 Date 数据添加如下注解:
public class JacksonData { String jacksonName; String jacksonValue; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date jacksonDate; ...
访问结果:(日期已显示规范格式, 但默认时区非东八区)
修改注解:
public class JacksonData { String jacksonName; String jacksonValue; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") Date jacksonDate; ...
访问结果:(东八区时间)
二. @JsonIgnore
添加了该属性的值将不会出现在返回的 json 数据中.
修改注解:
public class JacksonData { @JsonIgnore String jacksonName; String jacksonValue; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") Date jacksonDate; ...
访问结果:(无 jacksonName)
三. @JsonInclude(JsonInclude.Include.NON_NULL) 和 @JsonInclude(JsonInclude.Include.NON_EMPTY)
添加了 @JsonInclude(JsonInclude.Include.NON_NULL) 的属性, 若其值为 null, 则不展示(否则会显示值为 null), 但如果是一个空的数组或对象等时(即内容为空)仍会展示;
添加了 @JsonInclude(JsonInclude.Include.NON_EMPTY) 的属性, 当其值为 null 或空时, 都不展示.
四. @JsonProperty
默认情况下, json 中的 key 值和类中的属性名是相同的, 此注解用来重命名.
修改注解:
public class JacksonData { @JsonIgnore String jacksonName; @JsonProperty("value") String jacksonValue; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") Date jacksonDate; ...
访问结果:(jacksonValue -> value)
五. @JsonSerialize
为展示的数据添加修饰器, 修饰器可自定义.
创建 MySerializer.java:(用于将数据进行四舍五入并返回处理后的值)
public class MySerializer extends JsonSerializer<Double> { @Override public void serialize(Double value, JsonGenerator gen, SerializerProvider serializers) throws IOException { //将Double jacksonAmount的值 四舍五入 String number = BigDecimal.valueOf(value).setScale(2,BigDecimal.ROUND_HALF_UP).toString(); //输出 四舍五入后的值 gen.writeNumber(number); } }
在 JacksonData.java 中新建 JacksonAmount 属性, 并添加注解: @JsonSerialize(using = MySerializer.class)
public class JacksonData { @JsonIgnore String jacksonName; @JsonProperty("value") String jacksonValue; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") Date jacksonDate; @JsonSerialize(using = MySerializer.class) Double jacksonAmount; ...
在 servlet 中, 为 jacksonAmount 赋值100000.873:
... public JacksonData test1(){ System.out.println("test1"); JacksonData jacksonData = new JacksonData("name", "张三", new Date(), 100000.873); return jacksonData; } ...
访问结果:(被四舍五入为 100000.87)