起因
发现这个问题是在做学习项目的时候发现的:在实体类中增加了一个字段并且生成getter和setter方法后,发现返回给前端的json中也同步增加了一个key-value对,也就是自动调用了getter方法。我从controller层debug检查到了mapper后都没有发现我对返回的json更改过。后来发现是springboot内置的jackson的原因,就顺便学习了一下jackson和fastjosn。
例子
springboot中内置了jackson,在返回对象时会自动转化为json格式。通过一些注解可以修改返回的json。
示例:实体类
public class TestClass {private Integer code;private String message;@JsonProperty("modify2test_field")private String testField;public TestClass() {}public TestClass(Integer code, String message,String testField) {this.code = code;this.message = message;this.testField = testField;}//非field的getter方法public String getResult() {return code + ":" + message;}public String getTestField() {return testField;}public void setTestField(String testField) {this.testField = testField;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}@Overridepublic String toString() {return "TestClass{" +"code=" + code +", message='" + message + '\'' +'}';}
}
controller
@RestController
public class TestController {@RequestMapping("/test")public TestClass test() {TestClass testClass = new TestClass(200, "success","test");return testClass;}
}
对localhost:8080/test 发送请求后得到的json为:
{"code": 200,"message": "success","result": "200:success","modify2test_field": "test"
}
总结
在返回实体类时,jackson会自动调用其中的getter方法【private的需要同时有setter方法,或者在方法上加上@JsonIgnore注解】。
@JsonProperty("xxx")可以修改返回的json中的key值。
利用这个特性的应用:
//非field的getter方法public String getResult() {return code + ":" + message;}
这样可以返回一些数据库字段中不存在的值,操作简便很多。
另外,springboot自带的输出json格式用的是jackson,需要注意的是使用fastjson可能还需要另外注入bean对象,fastjson中修改字段名的注解是@JsonField和jackson的不同。(天知道我在这卡了多久)。
参考
https://www.cnblogs.com/Sinte-Beuve/p/7270782.html
https://blog.csdn.net/weixin_42078572/article/details/108499192