fastJson的@JSONField和jackson的@JsonProperty

在开发当中经常用到fastJson或jackson进行序列化和反序列化。下面分别介绍jackson@JsonProperty注解和fastJson的@JSONField注解。

一、jackson的@JsonProperty使用


    com.fasterxml.jackson.core
    jackson-databind
    2.5.3

@JsonProperty 此注解用于属性上,作用是把该属性的名称序列化为另外一个名称,如把trueName属性序列化为name,@JsonProperty(value="name")。

@JsonProperty("trueName")
private String name;

序列化之后,该name字段会显示为:

{"trueName":"张三"}

二、jackson的@JsonIgnore使用

作用:在json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。

使用方法:一般标记在属性或者方法上,返回的json数据即不包含该属性。 

场景模拟:

需要把一个List转换成json格式的数据传递给前台。但实体类中基本属性字段的值都存储在快照属性字段中。此时我可以在业务层中做处理,把快照属性字段的值赋给实体类中对应的基本属性字段。最后,我希望返回的json数据中不包含这两个快照字段,那么在实体类中快照属性上加注解@JsonIgnore,那么最后返回的json数据,将不会包含goodsInfo和extendsInfo两个属性值。


public class HistoryOrderBean {
 
    //基本属性字段
    private String insurantName;
    private String insuranceName;
    private String insurancePrice;
    private String insurancePicture;
    private String insuranceLimit;
 
    //快照属性字段
    @JsonIgnore
    private String goodsInfo;      //快照基本信息
    @JsonIgnore  
    private String extendsInfo;    //快照扩展属性信息
 
}

三、fastJson的@JSONField使用


    com.alibaba
    fastjson
    1.2.28
@JSONField(name = "trueName")
private String name;

序列化之后,该name字段会显示为:

{"trueName":"张三"}

 

 四、fastJson@JSONField注解中参数的介绍

package test;

import com.alibaba.fastjson.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Bird {
    //@JSONField(ordinal = 5, name = "内容是json字符串的属性,对比下差异")
    //private String dog;

    /**
     * ordinal,默认值为0
     */
    @JSONField(ordinal = 4, name = "生产日期", format = "yyyy年MM月dd日 HH时mm分ss秒")
    private Date birthday;

    @JSONField(ordinal = 3, name = "颜色")
    private String color;

    @JSONField(ordinal = 2, name = "体型大小")
    private String size;

    @JSONField(ordinal = 1, name = "年龄")
    private int age;
    /**
     * 反序列化false,那么在反序列化的时候,就不会把json的值转给对象的这个属性。
     */
    @JSONField(name = "名称", deserialize = false)
    private String name;
    /**
     * 不序列化此属性字段,那么在转json的时候,就不会在json中出现
     */
    @JSONField(ordinal = 7, name = "不序列化的属性字段", serialize = false)
    private String deserialize;
}
package test;

import com.alibaba.fastjson.JSON;

import java.util.Date;

public class SerializeTest {
    public static void main(String[] args) {
        Bird bird = new Bird(new Date(), "红色皮肤", "巨大无比", 18, "喜鹊", "不序列化的字段,是不会被转json输出的");
        System.out.println(bird.toString() + "\n");
        String s = JSON.toJSONString(bird);
        System.out.println(s + "\n");
        Bird deserialize = JSON.parseObject(s, Bird.class);
        System.out.println(deserialize == null ? "" : deserialize.toString());
    }
}

结果为:

Bird(birthday=Sun Aug 18 11:49:06 CST 2019, color=红色皮肤, size=巨大无比, age=18, name=喜鹊, deserialize=不序列化的字段,是不会被转json输出的)

{"名称":"喜鹊","年龄":18,"体型大小":"巨大无比","颜色":"红色皮肤","生产日期":"2019年08月18日 11时49分06秒"}

Bird(birthday=Sun Aug 18 11:49:06 CST 2019, color=红色皮肤, size=巨大无比, age=18, name=null, deserialize=null)

1,ordinal

这个值的设置,可以使对象的属性按这个顺序来输出,默认值是0,要是都不设置,那就按属性名称的字母顺序来输出,将上面注解中的ordinal和name参数去掉过后,结果如下:

package test;

import com.alibaba.fastjson.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Bird {
    //@JSONField(ordinal = 5, name = "内容是json字符串的属性,对比下差异")
    //private String dog;

    /**
     * ordinal,默认值为0
     */
    @JSONField(format = "yyyy年MM月dd日 HH时mm分ss秒")
    private Date birthday;

    private String color;

    private String size;

    private int age;
    /**
     * 反序列化false,那么在反序列化的时候,就不会把json的值转给对象的这个属性。
     */
    private String name;
    /**
     * 不序列化此属性字段,那么在转json的时候,就不会在json中出现
     */
    private String deserialize;
}
Bird(birthday=Sun Aug 18 11:53:18 CST 2019, color=红色皮肤, size=巨大无比, age=18, name=喜鹊, deserialize=不序列化的字段,是不会被转json输出的)

{"age":18,"birthday":"2019年08月18日 11时53分18秒","color":"红色皮肤","deserialize":"不序列化的字段,是不会被转json输出的","name":"喜鹊","size":"巨大无比"}

Bird(birthday=Sun Aug 18 11:53:18 CST 2019, color=红色皮肤, size=巨大无比, age=18, name=喜鹊, deserialize=不序列化的字段,是不会被转json输出的)

可以看到,默认是按照属性的名称的字母顺序输出的。我这依次是a b c d n s开头的属性名称。

2,name

把该属性的名称序列化为另外一个名称

3,format

针对日期属性,对日期进行格式化

4,serialize

序列化,默认值是true,都是序列化的,在model里面设置了个false,然后可以看到,在输出json字符串中,这个属性对应的key和value都不见了。

5,deserialize

这个反序列化,默认值也是true,默认都是需要反序列化的,对name属性设置是false,在字符串转对象对时候,发现对象对name属性是null了。

你可能感兴趣的:(Java)