Java中@JSONField和@JsonProperty注解的用法及区别详解

 更新时间:2024年06月07日 09:53:51   作者:MinggeQingchun  
@JsonProperty和@JSONField注解都是为了解决obj转json字符串的时候,将java bean的属性名替换成目标属性名,下面这篇文章主要给大家介绍了关于Java中@JSONField和@JsonProperty注解的用法及区别的相关资料,需要的朋友可以参考下

前言

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

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

一、@JSONField

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

1、name属性

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

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;

public class Test1Controller {
    public static void main(String[] args) {
        String str = "{\"ID\":11,\"Name\":\"张三\"}";

        User user = JSON.parseObject(str, User.class);
        System.out.println("User对象:" + user.toString());
    }
}

@Data
class User {
    @JSONField(name = "ID")
    private Integer userId;
    @JSONField(name = "Name")
    private String userName;

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", userName='" + userName + '\'' +
                '}';
    }
}

2、format属性

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

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

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;
}

二、@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 User {
    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 User{
    private String firstName;
    @JsonProperty(ignore = true)
    private String lastName;
}

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

三、@JSONField和@JsonProperty区别

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

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

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

4、在使用Jackson框架时,只能使用@JsonProperty注解,无法使用@JSONField注解!!!不然会导致解析失败,无法取到值,如下

import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

public class Test1Controller {
    public static void main(String[] args) {
        String str = "{\"ID\":11,\"Name\":\"张三\"}";

        User user = JSON.parseObject(str, User.class);
        System.out.println("User对象:" + user.toString());
    }
}

@Data
class User {
    @JsonProperty("ID")
    private Integer userId;
    @JsonProperty("Name")
    private String userName;

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", userName='" + userName + '\'' +
                '}';
    }
}

总结 

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

相关文章

  • 使用Spirng Boot Admin监控Spring Cloud应用项目

    使用Spirng Boot Admin监控Spring Cloud应用项目

    这篇文章主要介绍了使用Spirng Boot Admin监控Spring Cloud应用项目,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • ElasticSearch启动成功却无法在浏览器访问问题解决办法

    ElasticSearch启动成功却无法在浏览器访问问题解决办法

    因工作的需要,要使用elasticsearch,安装完了,启动也成功了之后发现了问题,这篇文章主要给大家介绍了关于ElasticSearch启动成功却无法在浏览器访问问题的解决办法,需要的朋友可以参考下
    2024-10-10
  • java中Pulsar InterruptedException 异常

    java中Pulsar InterruptedException 异常

    这篇文章主要为大家介绍了java中Pulsar InterruptedException 异常分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • 彻底理解Java中的ThreadLocal

    彻底理解Java中的ThreadLocal

     ThreadLocal翻译成中文比较准确的叫法应该是:线程局部变量。使用这个工具类可以很简洁地编写出优美的多线程程序。 接下来通过本文给大家介绍Java中的ThreadLocal,需要的朋友可以参考下
    2017-03-03
  • 浅谈java中六大时间类的使用和区别

    浅谈java中六大时间类的使用和区别

    下面小编就为大家带来一篇浅谈java中六大时间类的使用和区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • springboot+mybatis如何屏蔽掉mybatis日志

    springboot+mybatis如何屏蔽掉mybatis日志

    这篇文章主要介绍了springboot+mybatis如何屏蔽掉mybatis日志问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • SpringBoot中定位切点的两种常用方法

    SpringBoot中定位切点的两种常用方法

    有时候,我们使用AOP来进行放的增强,编写切面类的时候,需要定位在哪个方法上试用该切面进行增强,本片文章主要讲解两种在SpringBoot中定位切点的方法,感兴趣的可以了解一下
    2021-06-06
  • Java设计模式中的设计原则之合成复用原则详解

    Java设计模式中的设计原则之合成复用原则详解

    这篇文章主要介绍了Java设计模式中的设计原则之合成复用原则详解,原则是尽量使用合成/聚合的方式,而不是使用继承聚合关系表示的是整体和部分的关系,整体与部分可以分开,可以理解为成员变量和当前类的关系就是聚合关系,需要的朋友可以参考下
    2023-11-11
  • springboot如何读取模板文件

    springboot如何读取模板文件

    这篇文章主要介绍了springboot如何读取模版文件的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java使用ant.jar执行SQL脚本文件的示例代码

    Java使用ant.jar执行SQL脚本文件的示例代码

    这篇文章主要介绍了Java使用ant.jar执行SQL脚本文件,文中通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-02-02

最新评论