技术共享

SpringBoot注解--11--@JSONField @JsonProperty

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一个问题:后端实体类isXXX开头的属性,传到前端后自动去掉is

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解决方法:

  1. 将生成的isReceipt()方法名改成getIsReceipt()
  2. 在生成的get方法上面也就是isReceipt上面加上@JsonProperty(value = “isXXX”)注解
 @JsonProperty(value = "isReceipt")
    public boolean isReceipt() {
        return isReceipt;
    }
    @JsonProperty(value = "isExamine")
    public boolean isExamine() {
        return isExamine;
    }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

@JsonProperty和@JSONField

1.简介

  • @JsonProperty和@JSONField注解都是为了解决obj转json字符串的时候,将java bean的属性名替换成目标属性名。常见于调用第三方接口的时候属性名不一致的场景。
  • 两个注解的作用是相同的,只是来源不同,使用方式不同。下面将详解其异同!

2.注解的区别

2.1 底层框架不同

  • @JsonProperty 是Jackson实现的
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>版本号</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • @JSONField 是fastjson实现的
         <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>版本号</version>
        </dependency>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.2 作用域不同

@JSONproperty 注解用于属性上面

  • 如把trueName属性序列化为name,可以在属性名上面增加@JsonProperty(value=“name”)。

@JSONField 注解可以用于get、set 以及 属性上面

  • 如把trueName属性序列化为name,可以在get/set/属性名上面增加@JSONField(value=“name”)。

2.3 优劣对比

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

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

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

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

@JsonProperty

如果使用的是新建的springboot项目,默认就是Jackson序列化,直接在属性上使用注解即可。

1.依赖

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>版本号</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • @JsonProperty注解来源于jackson包,搭配ObjectMapper().writeValueAsString(实体类)方法使用,将实体类转换成json字符串。
  • 搭配ObjectMapper().readValue(字符串)方法使用,将json字符串转换成实体类。

2.测试json字符串与bean对象相互转换

实体类:User.java

import com.fasterxml.jackson.annotation.JsonProperty;
 
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
	@JsonProperty("JsonPropertyName")
	private String name;
	private String sex;
	private Integer age;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

测试方法:

@Test
public void testJsonProperty() throws IOException{
    //bean ---> json
	User user=new User("zhangsan","man",22);
	
	System.out.println(new ObjectMapper().writeValueAsString(user));
	

    //json ---> bean
	String str="{"sex":"man","age":22,"JsonPropertyName":"zhangsan"}";
	
	System.out.println(new ObjectMapper().readValue(str, User.class).toString());
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

测试结果:

{"sex":"man","age":22,"JsonPropertyName":"zhangsan"}
User [name=zhangsan, sex=man, age=22]
  • 1
  • 2
  • 可见,bean转成json字符串后,@JsonProperty注解的bean属性名已经替换成了指定属性名:JsonPropertyName;

  • json字符串转成bean后,@JsonProperty注解指定的属性名已经替换成了bean属性名:name;

@JSONField

1.依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>版本号</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • @JSONField是位于fastjson包里面,搭配JSON.toJSONString(实体类)方法使用,将实体类转换成json字符串。
  • 搭配JSON.parseObject(字符串,实体类.class)方法使用,将json字符串转换成实体类。

2.测试json字符串与bean对象相互转换

实体类:User.java

import com.alibaba.fastjson.annotation.JSONField;
 
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
	@JSONField(name="JSONFieldName")
	private String name;
	private String sex;
	private Integer age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

测试方法:

@Test
public void testSONField(){
    //bean ---> json
	User user=new User("zhangsan","man",22);
	System.out.println(JSON.toJSONString(user));
	
    //json ---> bean
	String str="{"JSONFieldName":"zhangsan","age":22,"sex":"man"}";
	System.out.println(JSON.parseObject(str, User.class).toString());	
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

测试结果:

{"JSONFieldName":"zhangsan","age":22,"sex":"man"}
User [name=zhangsan, sex=man, age=22]
  • 1
  • 2
  1. 可见,bean转成json字符串后,@JSONField注解的bean属性名已经替换成了指定属性名:JSONFieldName;
  2. json字符串转成bean后,@JSONField注解指定的属性名已经替换成了bean属性名:name;
  3. 测试结果同@JsonProperty。

3.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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 在上面的例子中,使用@JSONField注解指定了birthday属性的日期格式为“yyyy-MM-dd”
  • salary属性的数字格式为“#,###.00”

4. serialize属性

  • 通过serialize属性可以控制属性是否序列化到JSON对象中
  • 当serialize属性为false时,属性将不会序列化到JSON对象中,默认为true
public class User {
    @JSONField(serialize = false)
    private int userId;
    private String name;
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

5.deserialize属性

  • 通过deserialize属性可以控制是否将JSON对象中的属性反序列化到Java对象中
  • 当deserialize属性为false时,该属性将不会从JSON对象中反序列化到Java对象中,默认为true
public class User {
    private int userId;
    private String name;
    @JSONField(deserialize = false)
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

6.ordinal属性

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

  • 默认情况下,属性的顺序是按照属性在Java对象中的顺序排列的
public class User {
    @JSONField(ordinal = 2)
    private String name;
    @JSONField(ordinal = 1)
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

7.defaultValue属性

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

public class User {
    @JSONField(defaultValue = "0")
    private int userId;
    @JSONField(defaultValue = "N/A")
    private String name;
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

8. type属性

  • 通过type属性可以指定属性的类型
public class User {
    private int userId;
    @JSONField(type = FieldType.STRING)
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5

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