java中@JSONField和@JsonProperty注解的使用说明及对比

 更新时间:2023年11月16日 11:31:12   作者:WgRui  
@JSONField与@JsonProperty隶属两个不同的包,前者是阿里系的fastjson包,后者是spring boot官方使用的jackson包,本文主要介绍了java中@JSONField和@JsonProperty注解的使用说明及对比,感兴趣的可以了解一下

@JSONField

@JSONField注解是阿里巴巴的fastjson框架中的注解,用于指定JSON字符串中的属性名和Java对象中的属性名之间的映射关系

1. name属性

通过name属性可以指定将Java对象中的属性名映射为JSON对象中的属性名。默认情况下,JSON对象中的属性名与Java对象中的属性名相同

示例:

public class User {
    @JSONField(name = "id")
    private int userId;
    private String name;
    private int age;
}

在上面的例子中,使用@JSONField注解将Java对象中的userId属性映射为JSON对象中的id属性

2. format属性

通过format属性可以指定日期类型属性的格式,以及将数字类型转为字符串类型的格式

示例:

public class User {
    private String name;
    private int age;
    @JSONField(format = "yyyy-MM-dd")
    private Date birthday;
    @JSONField(format = "#,###.00")
    private double salary;
}

在上面的例子中,使用@JSONField注解指定了birthday属性的日期格式为“yyyy-MM-dd”,salary属性的数字格式为“#,###.00”

3. serialize属性

通过serialize属性可以控制属性是否序列化到JSON对象中

当serialize属性为false时,属性将不会序列化到JSON对象中,默认为true

示例:

public class User {
    @JSONField(serialize = false)
    private int userId;
    private String name;
    private int age;
}

在上面的例子中,使用@JSONField注解将userId属性从序列化中排除

4. deserialize属性

通过deserialize属性可以控制是否将JSON对象中的属性反序列化到Java对象中

当deserialize属性为false时,该属性将不会从JSON对象中反序列化到Java对象中,默认为true

示例:

public class User {
    private int userId;
    private String name;
    @JSONField(deserialize = false)
    private int age;
}

在上面的例子中,使用@JSONField注解将age属性从反序列化中排除

5. ordinal属性

通过ordinal属性可以指定属性的顺序

默认情况下,属性的顺序是按照属性在Java对象中的顺序排列的

示例:

public class User {
    @JSONField(ordinal = 2)
    private String name;
    @JSONField(ordinal = 1)
    private int age;
}

在上面的例子中,使用@JSONField注解指定了age属性的顺序为1,name属性的顺序为2

6. defaultValue属性

通过defaultValue属性可以指定属性在Java对象中的默认值

示例:

public class User {
    @JSONField(defaultValue = "0")
    private int userId;
    @JSONField(defaultValue = "N/A")
    private String name;
    private int age;
}

在上面的例子中,使用@JSONField注解指定了userId属性的默认值为0,name属性的默认值为“N/A”

7. type属性

通过type属性可以指定属性的类型

示例:

public class User {
    private int userId;
    @JSONField(type = FieldType.STRING)
    private int age;
}

在上面的例子中,使用@JSONField注解指定了age属性的类型为字符串类型

8. jsonDirect属性

通过jsonDirect属性可以指定属性是否应该直接输出为JSON字符串

默认情况下,属性将被转化为字符串并以引号标记输出

示例:

public class User {
    private String name;
    @JSONField(jsonDirect = true)
    private String jsonMessage;
}

在上面的例子中,使用@JSONField注解指定了jsonMessage属性应该直接输出为JSON字符串

9. parseFeatures属性和serializeFeatures属性

通过parseFeatures属性和serializeFeatures属性可以配置解析和序列化时的特性

具体可参考阿里巴巴fastjson的文档

示例:

public class User {
    private String name;
    private int age;
    @JSONField(parseFeatures = Feature.AllowSingleQuotes)
    private String message;
}

在上面的例子中,使用@JSONField注解指定了message属性在解析时允许使用单引号

@JsonProperty

@JsonProperty注解是Jackson框架中的注解,用法类似于@JSONField,也是指定JSON字符串中的属性名和Java对象中的属性名之间的映射关系

1. value

value属性用于指定序列化后的属性名称

如果未提供value属性,则属性名称默认与Java属性名称相同

示例:

public class Person {
    
    @JsonProperty("name")
    private String fullName;

}

在上面的例子中,将Java对象中fullName属性序列化为JSON对象中的"name"属性

2. defaultValue

defaultValue属性用于指定当Java对象属性值为null时,序列化为JSON时使用的默认值

该属性仅适用于对象属性而不适用于基本类型属性

示例:

public class Person {
    
    @JsonProperty(defaultValue = "John")
    private String firstName;
}

在上面的例子中,将未设置firstName的Person对象序列化为含有默认值"John"的JSON属性

3. access

access属性用于指定Java属性的访问级别

默认访问级别为PUBLIC,也可以设为READ_ONLY或WRITE_ONLY

示例:

public class Person {
    
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String password;
}

在上面的例子中,将Java对象中的password属性序列化为JSON时忽略掉

4. required

required属性指定此属性是否为必须字段

如果为true,则当将JSON转换回Java对象时,如果该属性不存在,则将引发异常

示例:

public class Person {
    
    @JsonProperty(required = true)
    private String name;
}

在上面的例子中,将Java对象中的name属性序列化为确保其在JSON对象中存在

5. defaultValue

defaultValue属性用于指定Java属性的默认值

在将JSON转换回Java对象时如果该属性不存在或为null,则使用默认值

示例:

public class Person {
    
    @JsonProperty(defaultValue = "30")
    private int age;
}

在上面的例子中,将Java对象中的age属性序列化为JSON时,如果该属性不存在,则使用默认值30

6. index

index属性用于指定序列化的属性在JSON对象中的位置,数值越小,位置越靠前

示例:

public class Person {
    
    @JsonProperty(index = 1)
    private String firstName;
    
    @JsonProperty(index = 0)
    private String lastName;
}

在上面的例子中,将Java对象中的lastName属性序列化为JSON对象中的第一个属性,firstName属性序列化为JSON对象中的第二个属性

7. accessMode

accessMode属性用于指定序列化时使用的访问模式

如果未指定,则默认为PROPETY模式,即访问getter方法获取属性值。另一个可用的模式是FIELD,即直接访问Java属性

示例:

public class Person {

    private String firstName;

    @JsonProperty(access = JsonProperty.Access.READ_ONLY, accessMode = JsonProperty.AccessMode.FIELD)
    private String lastName;
}

在上面的例子中,将Java对象中lastName属性序列化为JSON属性,直接访问Java属性值。

8. ignore

ignore属性用于指定是否忽略该属性

如果为true,则在序列化和反序列化时忽略该属性

示例:

public class Person {

    private String firstName;

    @JsonProperty(ignore = true)
    private String lastName;
}

在上面的例子中,将Java对象中的lastName属性忽略掉,不进行序列化和反序列化

优劣对比

1.@JSONField注解的使用方式更加简单,注解默认的值与属性名相同,而@JsonProperty需要手动指定属性名

2.@JSONField注解支持更多的属性映射选项,例如序列化时的日期格式,空值的处理方式等

3.@JSONField注解的性能较快,因为fastjson本身就是一款高性能的JSON处理库

4.在使用Jackson框架时,只能使用@JsonProperty注解,无法使用@JSONField注解

到此这篇关于java中@JSONField和@JsonProperty注解的使用说明及对比的文章就介绍到这了,更多相关java @JSONField和@JsonProperty 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java使用正则表达式去除小数点后面多余的0功能示例

    Java使用正则表达式去除小数点后面多余的0功能示例

    这篇文章主要介绍了Java使用正则表达式去除小数点后面多余的0功能,结合具体实例形式分析了java字符串正则替换相关操作技巧,需要的朋友可以参考下
    2017-06-06
  • 全面解析Java中的引用类型

    全面解析Java中的引用类型

    在Java中对象以引用来指向JVM的内存区块,这里我们总结了强引用、软引用、弱引用和假象引用(幽灵引用),下面就具体来全面解析Java中的引用类型:
    2016-05-05
  • Java程序执行cmd命令全过程

    Java程序执行cmd命令全过程

    这篇文章主要介绍了Java程序执行cmd命令全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 详解Spring Boot 使用Spring security 集成CAS

    详解Spring Boot 使用Spring security 集成CAS

    本篇文章主要介绍了详解Spring Boot 使用Spring security 集成CAS,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Java实现ZooKeeper的zNode监控

    Java实现ZooKeeper的zNode监控

    这篇文章主要介绍了Java实现ZooKeeper的zNode监控问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-08-08
  • Java HashSet添加 遍历元素源码分析

    Java HashSet添加 遍历元素源码分析

    这篇文章主要为大家详细介绍了HashSet、HashMap底层添加、遍历元素的机制,追踪并分析源码,文中的示例代码讲解详细,希望对大学有所帮助
    2022-07-07
  • spring boot实战教程之shiro session过期时间详解

    spring boot实战教程之shiro session过期时间详解

    这篇文章主要给大家介绍了关于spring boot实战教程之shiro session过期时间的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-10-10
  • MybatisPlus操作符和运算值详解

    MybatisPlus操作符和运算值详解

    在前端到后端的数据传递中,处理动态运算条件是一个常见的需求,本文介绍了如何在MybatisPlus中处理运算符和运算值的动态拼接问题,感兴趣的朋友一起看看吧
    2024-10-10
  • 使用Java将字符串在ISO-8859-1和UTF-8之间相互转换

    使用Java将字符串在ISO-8859-1和UTF-8之间相互转换

    大家都知道在一些情况下,我们需要特殊的编码格式,如:UTF-8,但是系统默认的编码为ISO-8859-1,遇到这个问题,该如何对字符串进行两个编码的转换呢,下面小编给大家分享下java中如何在ISO-8859-1和UTF-8之间相互转换,感兴趣的朋友一起看看吧
    2021-12-12
  • Java实现用位运算维护状态码

    Java实现用位运算维护状态码

    位运算是一种非常高效的运算方式,在算法考察中比较常见,那么业务代码中我们如何使用位运算呢,感兴趣的小伙伴快跟随小编一起学习一下吧
    2024-03-03

最新评论