@JSONField
主要用于返回出参转换
这个注解分别可以注解在实体类的属性、setter和getter方法上
public class Test{ /* 注解在属性上的时候可以设置一些序列化、格式化的属性 @JSONField(serialize = false)---->序列化的时候忽略这个属性 @JSONField(format = "yyyyMMdd")---->序列化和反序列化额时候使用yyyyMMdd,一般在Date类型的字段上使用 */ @JSONField(serialize = false) public String Name; /* 注解在set方法表示json转成bean的时候会将json中的Name属性赋值给实体类的Name */ @JSONField(name="Name") public void setName(String Name){ this.Name = Name; } /* 注解在get方法表示bean转换成json的时候会把实体类的Name属性值赋给json的Name */ @JSONField(name="Name") public String getName(){ return this.Name; } }
@JsonProperty
主要用于入参转换,和Json字符串序列化为Java对象
@JsonProperty是com.fasterxml.jackson.annotation下使用频率很高的一个常用注解,用于将json字符串中的某个字段和java对象中的某个属性进行匹配映射,同时可以将java对象中的属性转换为指定字段的json字符串。
在java属性上加上@JsonProperty注解:
@JsonProperty("jsonName") private String name;
测试
@Test public void testJsonProperty() throws IOException{ String jsonBean1 = "{\"jsonName\":\"xyz\",\"age\":\"12\",\"address\":\"china\"}"; ObjectMapper mapper = new ObjectMapper(); Object myBean1 = mapper.readerFor(MyBean.class).readValue(jsonBean1); System.err.println("Convert json to java: "+ myBean1.toString()); MyBean myBean = new MyBean("xyz", "China", 12); System.err.println("Conver java to json: " + mapper.writeValueAsString(myBean)); }
运行结果
@SerializedName
@SerializedName是com.google.gson.annotations下的常用注解,作用和@JsonProperty差不多,重点是可以将多个字段名称映射到一个字段属性上
SerializedName 改变了默认序列化和默认反序列化的字段取值,所以,如果你使用 Gson 将 Java model 类生称 JSON 串,结果就是 value 的名称就是字段的名称。
SerializedName 接受两个参数,value、alternate,第一个value是默认参数,如果你只填了一个参数,那这个值将会赋值给 value。
alternate 属性是用在反序列化上的,也就是说从 JSON 到 Java 类的过程。Gson 会帮我们匹配 JSON 中的命名,并尝试找到一个字段映射。无论哪一个都会映射。
在java属性上加上@SerializedName注解:
@SerializedName("jsonName", alternate = "json_name, json") private String name;
测试
@Test public void testFromJeson() throws IOException { String jsonBean1 = "{\"jsonName\":\"xyz\",\"age\":\"12\",\"address\":\"china\"}"; MyBean myBean = new MyBean("xyz", "China", 12); // 注意:写法和@JsonProperty不同 Gson gson = new Gson(); MyBean myBean1 = gson.fromJson(jsonBean1, MyBean.class); System.err.println("jesonBean1: "+ myBean1.toString()); String toJson = gson.toJson(myBean); System.err.println("toJson: " + toJson); }
运行结果
@JsonProperty和@SerializedName对比
在Controller添加:
@RequestMapping("/student2") public Student getStudentByJson(){ Gson gson = new Gson(); String studentJson = "{studentName:张三,studentAge:25}"; Student stu = gson.fromJson(studentJson,Student.class); return stu; }
访问得到:
{"stuName":null,"stuAge":null}
加入@SerializedName注解
@Data public class Student { @JsonProperty("stuName") @SerializedName("studentName") private String name; @SerializedName("studentAge") @JsonProperty("stuAge") private Integer age; }
再次访问项目:
{"stuName":"张三","stuAge":25}
总结:
@JsonProperty使对象属性输出为@JsonProperty内的内容。
@SerializedName使对象属性序列化为想要的值
官网:
https://www.baeldung.com/jackson-annotations
http://www.javacreed.com/simple-gson-example/