记一次开发遇到的问题:@JSONField和@JsonProperty注解的区别

@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);
    }
}

结果:

至此,两种注解都能达到想要效果,但是当把这个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数据即不包含该属性。

Supongo que te gusta

Origin blog.csdn.net/SHUKAI618/article/details/117110906
Recomendado
Clasificación