在开发当中经常用到fastJson或jackson进行序列化和反序列化。下面分别介绍jackson@JsonProperty注解和fastJson的@JSONField注解。
com.fasterxml.jackson.core
jackson-databind
2.5.3
@JsonProperty 此注解用于属性上,作用是把该属性的名称序列化为另外一个名称,如把trueName属性序列化为name,@JsonProperty(value="name")。
@JsonProperty("trueName")
private String name;
序列化之后,该name字段会显示为:
{"trueName":"张三"}
作用:在json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。
使用方法:一般标记在属性或者方法上,返回的json数据即不包含该属性。
场景模拟:
需要把一个List
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; //快照扩展属性信息
}
com.alibaba
fastjson
1.2.28
@JSONField(name = "trueName")
private String name;
序列化之后,该name字段会显示为:
{"trueName":"张三"}
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了。