首页 前端知识 @JSONField或@JsonProperty注解使用

@JSONField或@JsonProperty注解使用

2024-05-10 22:05:21 前端知识 前端哥 122 331 我要收藏

一、需求

使用@JSONField或@JsonProperty注解,来解决bean与json字段不一致问题,或者字段定义不符合前端所需要的标准,最近在项目中发现实体类属性中,同时使用了@JSONField和@JsonProperty注解,用于重新声明属性key。有时候注解生效,有时候注解不生效。我很好奇到底是哪个注解生效了,于是进行了各种验证,基本搞明白了。

二、@JsonProperty和@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)

(3)作用域

@JSONproperty 注解用于属性上面
如把trueName属性序列化为name,可以在属性名上面增加@JsonProperty(value=“name”)。

@JSONField 注解可以用于get、set以及属性上面
如把trueName属性序列化为name,可以在get/set/属性名上面增加@JSONField(value=“name”)。

三、pom依赖

         <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83</version>
        </dependency>

四、使用@JsonProperty

如果使用的是新建的springboot项目,默认就是Jackson序列化,直接在属性上使用注解即可。

五、使用@JSONField

必须重写数据解析器,使用fastjson进行序列化和反序列化。配置类如下:

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;

import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author: 
 * @Description
 * @Date: 下午1:59 2023/11/9
 */
@Configuration
public class WebMvcConfiguration {

    @Bean
    public HttpMessageConverter configureMessageConverters() {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig config = new FastJsonConfig();
        config.setSerializerFeatures(
                // 保留map空的字段
                SerializerFeature.WriteMapNullValue,
                // 将String类型的null转成""
                SerializerFeature.WriteNullStringAsEmpty,
                // 将Number类型的null转成0
                SerializerFeature.WriteNullNumberAsZero,
                // 将List类型的null转成[]
                SerializerFeature.WriteNullListAsEmpty,
                // 将Boolean类型的null转成false
                SerializerFeature.WriteNullBooleanAsFalse,
                // 避免循环引用
                SerializerFeature.DisableCircularReferenceDetect);

        converter.setFastJsonConfig(config);
        converter.setDefaultCharset(Charset.forName("UTF-8"));
        List<MediaType> mediaTypeList = new ArrayList<>();
        // 解决中文乱码问题,相当于在Controller上的@RequestMapping中加了个属性produces = "application/json"
        mediaTypeList.add(MediaType.APPLICATION_JSON);
        converter.setSupportedMediaTypes(mediaTypeList);
        return converter;
    }
}

六、实体类

import com.alibaba.fastjson.annotation.JSONField;
/**
 * @Author: 
 * @Description
 * @Date: 上午10:36 2023/11/9
 */
public class JSONFieldData {
    @JSONField(name="my_name")
    private String name;
    private String phone;
    @JSONField(name="my_age")
    private Integer age;

    public JSONFieldData() {
    }

    public JSONFieldData(String name, String phone, Integer age) {
        this.name = name;
        this.phone = phone;
        this.age = age;
    }


    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public Integer getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "JSONFieldData{" +
                "name='" + name + '\'' +
                ", phone='" + phone + '\'' +
                ", age=" + age +
                '}';
    }
}

七、定义controller

import org.springframework.web.bind.annotation.*;

/**
 * @Author: 
 * @Description
 * @Date: 上午10:42 2023/11/9
 */
@RestController
@RequestMapping("/json")
public class JSONFieldApi {

    @GetMapping("/test1")
    public Object testJson() {
        JSONFieldData data = new JSONFieldData();
        data.setName("cjAqNP");
        data.setPhone("bdfuNn");
        data.setAge(399);
        return data;
    }

    @PostMapping("/test2")
    public Object testJson2(@RequestBody JSONFieldData data) {
        return data;
    }

}

八、测试@JSONField注解

在这里插入图片描述
在这里插入图片描述

转载请注明出处或者链接地址:https://www.qianduange.cn//article/8115.html
评论
发布的文章
大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!