sunny123456

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

@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
原文链接:https://blog.csdn.net/qq_42331108/article/details/133998284
posted on 2024-04-07 20:07  sunny123456  阅读(143)  评论(0)    收藏  举报