@JSONField 坑点 结论:若属性是私有的,必须有set*方法。否则无法反序列化。
@JSONField 坑点
结论:若属性是私有的,必须有set*方法。否则无法反序列化。
原因:
主要原因是 JSONField 注解是通过反射来操作对象的属性的,而在 Java 类中一般情况下,字段是私有的,不能直接访问。所以需要通过 get 方法来获取字段的值,通过 set 方法来设置字段的值。
假设一个字段名为 data,则 JSONField 注解会尝试调用 getData() 方法来获取字段的值,在反序列化时将 JSON 字符串中对应的值设置给字段;在序列化时会调用 setData() 方法来获取字段的值,将其作为 JSON 字符串中对应的值。
如果没有对应的 get 和 set 方法,JSONField 注解就无法直接访问字段,从而无法完成反序列化和序列化操作。
使用
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
//说明可以作用与三种类型之上
/*这意味着带有这个注解的注解可以用于方法(包括构造方法)、字段和参数。*/
- ElementType.METHOD 表示注解可以用于方法,包括实例方法以及静态方法。
- ElementType.FIELD 表示注解可以用于字段,表示类的属性。
- ElementType.PARAMETER 表示注解可以用于方法的参数。
- 1
- 2
- 3
- 4
- 5
- 6
eg:
1FieldInfo可以配置在getter/setter方法或者字段上。例如:
public class A {
private int id;
@JSONField(name="ID")
public int getId() {return id;}
@JSONField(name="ID")
public void setId(int value) {this.id = id;}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
2 配置在field上
public class A {
@JSONField(name="ID")
private int id;
public int getId() {return id;}
public void setId(int value) {this.id = id;}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
3 使⽤format配置⽇期格式化
public class A {
// 配置date序列化和反序列使⽤yyyyMMdd⽇期格式
@JSONField(format="yyyyMMdd")
public Date date;
}
- 1
- 2
- 3
- 4
- 5
4 使⽤serialize/deserialize指定字段不序列化
public class A {
@JSONField(serialize=false)
public Date date;
}
- 1
- 2
- 3
- 4
5 使⽤ordinal指定字段的顺序
注:缺省fastjson序列化一个java bean,是根据fieldName的字母序进行序列的你可以通过ordinal指定字段的顺序。这个特性需要1.1.42以上版本。
public static class VO {
@JSONField(ordinal = 3)
private int f0;
@JSONField(ordinal = 2)
private int f1;
@JSONField(ordinal = 1)
private int f2;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8