@JSONField和@JsonProperty注解的區(qū)別
在一次開發(fā)過(guò)程中需要將請(qǐng)求報(bào)文的字段通過(guò)been做一次轉(zhuǎn)換,發(fā)現(xiàn)@JSONField可以正常轉(zhuǎn)換,而@JsonProperty會(huì)出現(xiàn)失效的問(wèn)題,于是總結(jié)了兩注解的區(qū)別:
相同
都能解決json字符串的某些屬性名和JavaBean中的屬性名匹配不上的問(wèn)題:
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 測(cè)試@JSONField和@JsonProperty注解
* @AUTHER: sk
* @DATE: 2021/4/21
**/
@Data
public class TestPayList {
//測(cè)試@JSONField注解
@JSONField(name ="curRepayAmt")
private BigDecimal payAmt;
//測(cè)試@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);
}
}
結(jié)果:
image
至此,兩種注解都能達(dá)到想要效果,但是當(dāng)把這個(gè)been作為結(jié)果返回時(shí),@JsonProperty會(huì)出現(xiàn)失效的情況,總結(jié)下原因是因?yàn)樽詈箜憫?yīng)時(shí)是使用FastJson做json序列化(阿里巴巴的),換成net.sf.json.JSONObject就行了,但是為了方便,我選擇了統(tǒng)一使用@JSONField注解
區(qū)別
1.框架不同
@jsonProperty是 Jackson的包,而@jsonfield是fastjson的包
2.用法不同
(1)bean轉(zhuǎn)換成Json字符串:
@JsonProperty:ObjectMapper().writeValueAsString(Object value)
@JSONField:ObjectMapper().readValue(String content, Class valueType)
(2)Json字符串轉(zhuǎn)化為bean:
@JsonProperty:ObjectMapper().readValue(String content, Class valueType)
@JSONField:JSONObject.parseObject(String content, Class valueType)
@JSONField這個(gè)注解可以用于get、set以及屬性上面
(3)@JSONproperty這個(gè)注解用于屬性上面
如把trueName屬性序列化為name,可以在屬性名上面增加@JsonProperty(value=“name”)。
(4)jackson的@JsonIgnore使用
作用:在json序列化時(shí)將java bean中的一些屬性忽略掉,序列化和反序列化都受影響。
使用方法:一般標(biāo)記在屬性或者方法上,返回的json數(shù)據(jù)即不包含該屬性。
