记一次开发遇到的问题:@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);
    }
}

结果:


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数据即不包含该属性。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容