首页 > 其他分享 >@JSONField 坑点 结论:若属性是私有的,必须有set*方法。否则无法反序列化。

@JSONField 坑点 结论:若属性是私有的,必须有set*方法。否则无法反序列化。

时间:2024-04-07 20:11:22浏览次数:24  
标签:序列化 坑点 id int 字段 set JSONField public

@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

标签:序列化,坑点,id,int,字段,set,JSONField,public
From: https://www.cnblogs.com/sunny3158/p/18119789

相关文章

  • Array and Set work process
    目录Arrayworkprinciple分析Array操作步骤数readfindinsertdeleteSetworkprinciple分析Set操作步骤数readfindinsertdeleteJavaCollectionClass从单词来看,Array很好理解一批一批的意思;Set含义比较多,常见有放、集合、一套...;从字面来记忆它们的区别,Array就是一批一批......
  • 【26.1】Django框架之settings配置
    【一】引言Django项目的设置文件位于项目同名目录下,名叫settings.py。这个模块,集合了整个项目方方面面的设置属性,是项目启动和提供服务的根本保证。【二】简述settings.py文件本质上是一个Python模块,带有模块级别的变量。下面是一些示例设置:ALLOWED_HOSTS=['www.examp......
  • 【26.0】Django框架之settings源码
    【一】Django配置文件介绍Django框架默认提供给我们一个配置文件在我们项目根目录下的setting.py文件中,在里面我们可以看到很多的配置项并且我们能够自主的添加相应的配置但是其实这个文件只是Django暴露出来给我们的一个接口文件,在Django内部还存在一个更加强大的配置文件......
  • 【26.2】Django框架之settings核心配置项
    【一】前言【1】引言Django的默认配置文件中,包含上百条配置项目其中很多是我们‘一辈子’都不碰到或者不需要单独配置的这些项目在需要的时候再去查手册。【2】强调配置的默认值不是在settings.py文件中!不要以为settings.py中的配置值就是默认值,参考前文。settings.py......
  • memset()函数及其作用
    一、memset()memset()函数是C/C++语言中的一个标准库函数,用于将一块内存空间的内容设置为指定的值。其函数原型为:void*memset(void*ptr,intvalue,size_tnum);参数说明:-ptr:指向要设置数值的内存块的指针。-value:要设置的值,通常是一个无符号字符。-num:要设......
  • 在使用set添加对象的时候,重写了hashcode方法后,为什么equals返回的仍是false,如何理解ha
    /**1.对象的哈希码值和内存地址值不是一回事;*2.如果自定义类不复写Object类中的equals方法,那么equals比较的就是两个对象的内存地址值。*//***下面证明了hash值和内存地址的关系*一、当没有重写hashCode()方法的时候,*S......
  • Spring反序列化JNDI分析
    漏洞原理Spring框架的JtaTransactionManager类中重写了readObject方法,这个方法最终会调用到JNDI中的lookup()方法,关键是里面的参数可控,这就导致了攻击者可以利用JNDI注入中的lookup()参数注入,传入恶意URI地址指向攻击者的RMI注册表服务,以使受害者客户端加载绑定在攻击者RMI注册表......
  • Replication Controller、ReplicaSet和Deployment(Kubernetes调度系列,结合操作命令讲解
    目录一、概述二、ReplicationController2.1ReplicationController说明2.2ReplicationController举例三、ReplicaSet3.1ReplicaSet说明3.2ReplicaSet举例四、无状态应用管理Deployment4.1概述4.2创建Deployment4.2.1Deployment标签内容解析4.2.2ku......
  • CF895C Square Subsets 题解
    看到\(a_i\le70\)后,发现\(n\)啥用没有,因为只需要枚举\(1-70\)选几个即可。看到求完全平方数后,想到分解质因数,由于\(a_i\le70\),所以只有\(19\)个质数,可以进行状压dp。设\(dp_{i,j}\)表示枚举到\(i\),状态为\(j\)的方案数,便有:\[dp_{i,j}=dp_{i-1,j}+dp_{i-1,j\o......
  • MPAndroidChart setLabelRotationAngle bug
    MPAndroidChartsetLabelRotationAnglebug(应该包括其他关于修改x/ylabel的bug)库是好库,但就是不更新了。。bug描述:修改labelRotationAngle(setLabelRotationAngle()),手势缩放一下视图,才触发自动调整视图,会导致图表大小发生变化。用起来就是,第一次显示,label被截断,必须手动缩放一......