应用场景: 当我们在与前端进行交互时,前端想要的字段与我们提供的字段名不同,这时候一种解决方案是修改实体类,但如果该实体类应用的比较多,那改起来的代价太大,因此,可以使用注解@JSONField
来实现替换效果,用法如下:
@JSONField(name = "size_new")
private int size;
1. JSON内容与实体类,@JSONField常规写法
JSON(与下述JSON字符串内容一致)
{
size: 5,
weight: 10,
colour: "red"
}
实体类(AppleDO.java)
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;
public class AppleDO {
@JSONField(name = "size_new")
private int size;
@JSONField(name = "weight_new")
private int weight;
@JSONField(name = "colour_new")
private String colour;
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public String getColour() {
return colour;
}
public void setColour(String colour) {
this.colour = colour;
}
}
2. JSON字符串转对应Java对象
执行代码
public static void main(String[] args) {
String json = "{\n" +
" size_new: 5,\n" +
" weight_new: 10,\n" +
" colour_new: \"red\",\n" +
"}";
AppleDO appleDO = JSON.parseObject(json, AppleDO.class);
System.out.println(appleDO.getSize());
System.out.println(appleDO.getWeight());
System.out.println(appleDO.getColour());
}
运行结果
3. 支持序列化和反序列化
源码中的序列化和反序列化默认值均为true
,则默认情况下是允许该字段序列化和反序列化的,如下:
boolean serialize() default true;
boolean deserialize() default true;
使用方法(以下不支持序列化,支持反序列化)
@JSONField(name = "size_new", serialize = false, deserialize = true)
private int size;
当我们的某些字段为空值时,我们仍希望将此字段返回到前端(该配置可以返回带有空字段的字符串,但是当字段为基本数据类型时无效,须将其转换为包装类)
@JSONField(serialzeFeatures= SerializerFeature.WriteMapNullValue)
4. 指定字段顺序
将Java对象转换为JSON格式,转换后的字段顺序会根据首字母来排序,亦可通过如下方式来指定字段顺序:
@JSONField(name = "size_new", ordinal = 3)
private int size;
@JSONField(name = "weight_new", ordinal = 1)
private int weight;
@JSONField(name = "colour_new", ordinal = 2)
private String colour;
执行代码
AppleDO apple = new AppleDO();
apple.setSize(6);
apple.setWeight(12);
apple.setColour("green");
String appleStr = JSON.toJSONString(apple);
System.out.println(appleStr);
加ordinal参数之前运行结果
加ordinal参数之后运行结果