欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > SpringBoot注解--11--@JSONField @JsonProperty

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

2024/10/23 5:10:59 来源:https://blog.csdn.net/weixin_48052161/article/details/140126970  浏览:    关键词:SpringBoot注解--11--@JSONField @JsonProperty

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

文章目录

  • 一个问题:后端实体类isXXX开头的属性,传到前端后自动去掉is
    • 解决方法:
  • @JsonProperty和@JSONField
    • 1.简介
    • 2.注解的区别
      • 2.1 底层框架不同
      • 2.2 作用域不同
      • 2.3 优劣对比
  • @JsonProperty
        • 如果使用的是新建的==springboot项目==,默认就是Jackson序列化,直接在属性上使用注解即可。
    • 1.依赖
    • 2.测试json字符串与bean对象相互转换
  • @JSONField
    • 1.依赖
    • 2.测试json字符串与bean对象相互转换
    • 3.format属性
    • 4. serialize属性
    • 5.deserialize属性
    • 6.ordinal属性
    • 7.defaultValue属性
    • 8. type属性


一个问题:后端实体类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;}

在这里插入图片描述

@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>
  • @JSONField 是fastjson实现的
         <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>版本号</version></dependency>

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

测试方法:

@Test
public void testJsonProperty() throws IOException{//bean ---> jsonUser user=new User("zhangsan","man",22);System.out.println(new ObjectMapper().writeValueAsString(user));//json ---> beanString str="{\"sex\":\"man\",\"age\":22,\"JsonPropertyName\":\"zhangsan\"}";System.out.println(new ObjectMapper().readValue(str, User.class).toString());
}

测试结果:

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

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

@JSONField

1.依赖

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>版本号</version>
</dependency>
  • @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;
}

测试方法:

@Test
public void testSONField(){//bean ---> jsonUser user=new User("zhangsan","man",22);System.out.println(JSON.toJSONString(user));//json ---> beanString str="{\"JSONFieldName\":\"zhangsan\",\"age\":22,\"sex\":\"man\"}";System.out.println(JSON.parseObject(str, User.class).toString());	
}

测试结果:

{"JSONFieldName":"zhangsan","age":22,"sex":"man"}
User [name=zhangsan, sex=man, age=22]
  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;
}
  • 在上面的例子中,使用@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;
}

在上面的例子中,使用@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;
}

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

6.ordinal属性

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

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

在上面的例子中,使用@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;
}

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

8. type属性

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

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com