当前位置: 首页 > news >正文

@JSONField或@JsonProperty注解使用

一、需求

使用@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 {@Beanpublic HttpMessageConverter configureMessageConverters() {FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();FastJsonConfig config = new FastJsonConfig();config.setSerializerFeatures(// 保留map空的字段SerializerFeature.WriteMapNullValue,// 将String类型的null转成""SerializerFeature.WriteNullStringAsEmpty,// 将Number类型的null转成0SerializerFeature.WriteNullNumberAsZero,// 将List类型的null转成[]SerializerFeature.WriteNullListAsEmpty,// 将Boolean类型的null转成falseSerializerFeature.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;}@Overridepublic 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注解

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

相关文章:

  • Vscode Vim自动切换
  • [Hive] CTE 通用表达式 WITH关键字
  • MFC-TCP网络编程服务端-Socket
  • 数据结构(C语言) 实验-栈与字符串
  • Win10共享打印机,别人连接不上出现无法连接到打印机错误码0x0000011b
  • CH11_重构API
  • java项目之戒烟网站(ssm+vue)
  • Zabbix深入解析与实战
  • 图形界面应用案例——关灯游戏(以及扩展)(python)
  • 用 winget 在 Windows 上安装 kubectl
  • centerOS下docker 搭建IotDB集群
  • python开发过程中注意编码规范~
  • python 字典Dict
  • 蓝桥杯每日一题203.11.7
  • 以 Kubernetes 原生方式实现多集群告警
  • @jsonView过滤属性
  • ES6--对象的扩展
  • Spring框架之我见(三)——IOC、AOP
  • Windows Containers 大冒险: 容器网络
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 复杂数据处理
  • 高度不固定时垂直居中
  • 构造函数(constructor)与原型链(prototype)关系
  • 如何胜任知名企业的商业数据分析师?
  • 白色的风信子
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 函数计算新功能-----支持C#函数
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 数据库巡检项
  • #### go map 底层结构 ####
  • #LLM入门|Prompt#3.3_存储_Memory
  • #宝哥教你#查看jquery绑定的事件函数
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (编译到47%失败)to be deleted
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (十) 初识 Docker file
  • (十三)Maven插件解析运行机制
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET Project Open Day(2011.11.13)
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET微信公众号开发-2.0创建自定义菜单
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • @SuppressWarnings注解
  • @Transaction注解失效的几种场景(附有示例代码)
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [20190401]关于semtimedop函数调用.txt
  • [bug总结]: Feign调用GET请求找不到请求体实体类
  • [bzoj1038][ZJOI2008]瞭望塔