项目中需要的需求是将
"custom_name","name
都反序列化
name
,而@JsonProperty注解不满足要求,因此研究了一下@JsonAlias,并通过demo测试确定了两者的区别。
1. @JsonAlias 反序列化
@Data
public class Staff {
@JsonAlias({"custom_name","name"})
private String name;
private int age;
private String[] position;
private List<String> skills;
private Map<String, BigDecimal> salary;
}
① Json字符串中使用 name:
{
"name" : "mkyong",
"age" : 38,
"position" : [ "Founder", "CTO", "Writer" ],
"skills" : [ "java", "python", "node", "kotlin" ],
"salary" : {
"2018" : 14000,
"2012" : 12000,
"2010" : 10000
}
}
输出:
Staff(name=mkyong, age=38, position=[Founder, CTO, Writer], skills=[java, python, node, kotlin], salary={2018=14000, 2012=12000, 2010=10000})
② Json字符串中使用 custom_name:
{
"custom_name" : "mkyong",
"age" : 38,
"position" : [ "Founder", "CTO", "Writer" ],
"skills" : [ "java", "python", "node", "kotlin" ],
"salary" : {
"2018" : 14000,
"2012" : 12000,
"2010" : 10000
}
}
Staff(name=mkyong, age=38, position=[Founder, CTO, Writer], skills=[java, python, node, kotlin], salary={2018=14000, 2012=12000, 2010=10000})
@JsonAlias({"custom_name","name"})
,反序列化时,Json字符串中name,custom_name,都可以转为 Staff 对象的属性name。
2. @JsonAlias 序列化
@Data
public class Staff {
@JsonAlias({"custom_name","name1"})
private String name;
private int age;
private String[] position;
private List<String> skills;
private Map<String, BigDecimal> salary;
}
输出:
{
"name" : "mkyong",
"age" : 38,
"position" : [ "Founder", "CTO", "Writer" ],
"skills" : [ "java", "python", "node", "kotlin" ],
"salary" : {
"2018" : 14000,
"2012" : 12000,
"2010" : 10000
}
}
@JsonAlias({"custom_name","name"})
,序列化时,无论注解中是什么,都会序列化为Staff对象中的原有属性name
3. @JsonProperty 反序列化
序列化:将 json 字符串转为 java 对象
@Data
public class Staff {
@JsonProperty("custom_name")
private String name;
private int age;
private String[] position;
private List<String> skills;
private Map<String, BigDecimal> salary;
}
① Json字符串中使用 custom_name:
{
"custom_name" : "mkyong",
"age" : 38,
"position" : [ "Founder", "CTO", "Writer" ],
"skills" : [ "java", "python", "node", "kotlin" ],
"salary" : {
"2018" : 14000,
"2012" : 12000,
"2010" : 10000
}
}
输出:
Staff(name=mkyong, age=38, position=[Founder, CTO, Writer], skills=[java, python, node, kotlin], salary={2018=14000, 2012=12000, 2010=10000})
② Json字符串中使用name:报错
{
"name" : "mkyong",
"age" : 38,
"position" : [ "Founder", "CTO", "Writer" ],
"skills" : [ "java", "python", "node", "kotlin" ],
"salary" : {
"2018" : 14000,
"2012" : 12000,
"2010" : 10000
}
}
@JsonProperty("custom_name")
,将 json 转为 Staff 对象时,json中只能是custom_name。
4. @JsonProperty 序列化
序列化:将 Java 对象转为 json 字符串
@Data
public class Staff {
@JsonProperty("custom_name")
private String name;
private int age;
private String[] position;
private List<String> skills;
private Map<String, BigDecimal> salary;
}
输出:
{
"age" : 38,
"position" : [ "Founder", "CTO", "Writer" ],
"skills" : [ "java", "python", "node", "kotlin" ],
"salary" : {
"2018" : 14000,
"2012" : 12000,
"2010" : 10000
},
"custom_name" : "mkyong"
}
@JsonProperty("custom_name")
,将 Staff 对象中的属性 name 序列化为 Json 串中的 custom_name