@JSONField和@JsonProperty注解的区别
在一次开发过程中需要将请求报文的字段通过been做一次转换,发现@JSONField可以正常转换,而@JsonProperty会出现失效的问题,于是总结了两注解的区别:
相同
都能解决json字符串的某些属性名和JavaBean中的属性名匹配不上的问题:
package mrt;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* @description 测试@JSONField和@JsonProperty注解
* @AUTHER: sk
* @DATE: 2021/4/21
**/
@Data
public class TestPayList {
//测试@JSONField注解
@JSONField(name ="curRepayAmt")
private BigDecimal payAmt;
//测试@JsonProperty注解
@JsonProperty("payerPayNo")
private String payNo;
public static void main(String[] args) {
String str = "{\n" +
" \"curRepayAmt\": 1200,\n" +
" \"payerPayNo\": \"202102271616153\"\n" +
" \n" +
"}";
TestPayList testPayList = JSONObject.parseObject(str, TestPayList.class);
System.out.println("testPayList="+testPayList);
}
}
结果:
image
至此,两种注解都能达到想要效果,但是当把这个been作为结果返回时,@JsonProperty会出现失效的情况,总结下原因是因为最后响应时是使用FastJson做json序列化(阿里巴巴的),换成net.sf.json.JSONObject就行了,但是为了方便,我选择了统一使用@JSONField注解
区别
1.框架不同
@jsonProperty是 Jackson的包,而@jsonfield是fastjson的包
2.用法不同
(1)bean转换成Json字符串:
@JsonProperty:ObjectMapper().writeValueAsString(Object value)
@JSONField:ObjectMapper().readValue(String content, Class valueType)
(2)Json字符串转化为bean:
@JsonProperty:ObjectMapper().readValue(String content, Class valueType)
@JSONField:JSONObject.parseObject(String content, Class valueType)
@JSONField这个注解可以用于get、set以及属性上面
(3)@JSONproperty这个注解用于属性上面
如把trueName属性序列化为name,可以在属性名上面增加@JsonProperty(value=“name”)。
(4)jackson的@JsonIgnore使用
作用:在json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。
使用方法:一般标记在属性或者方法上,返回的json数据即不包含该属性。
网友评论