(七) - 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)

 

posted @ 2020-12-16 16:04  山下明明子  阅读(212)  评论(0编辑  收藏  举报