提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 一个问题:后端实体类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
解决方法:
- 将生成的isReceipt()方法名改成getIsReceipt()
- 在生成的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 优劣对比
-
@JSONField注解的使用方式更加简单,注解默认的值与属性名相同,而@JsonProperty需要手动指定属性名
-
@JSONField注解支持更多的属性映射选项,例如序列化时的日期格式,空值的处理方式等
-
@JSONField注解的性能较快,因为fastjson本身就是一款高性能的JSON处理库
-
在使用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]
- 可见,bean转成json字符串后,@JSONField注解的bean属性名已经替换成了指定属性名:JSONFieldName;
- json字符串转成bean后,@JSONField注解指定的属性名已经替换成了bean属性名:name;
- 测试结果同@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属性的类型为字符串类型