SpringBoot @JsonProperty + @JsonMixin注解 实现返回json数据key的转换

news2024/10/6 2:23:06

参考资料

  1. Springboot 一个注解搞定返回参数key转换 【实用】
  2. Spring Boot 2.7新特性:@JsonMixin

目录

  • 一. 需求
  • 二. 前期准备
  • 三. 解决方式一: @JsonProperty注解
  • 三. 解决方式二: @JsonProperty + @JsonMixin注解
    • 3.1 方式1 混入单个类
      • 3.1.1 创建一个被@JsonMixin注解修饰的抽象类
      • 3.1.2 调用查看效果
    • 3.2 方式2 混入多个类
      • 3.2.1 第三方接口中的类
      • 3.2.2 @JsonMixin注解混入多个类
      • 3.2.3 定义实体类组合第三方接口中的类
      • 3.2.4 调用查看效果


一. 需求

项目中我们有可能调用第三方接口,返回数据。

⏹我们期待的数据为

{
	"id": "110120119",
	"name": "jiafeitian",
	"address": "地球"
}

⏹但是第三方接口返回的数据为

{
	"id": "110120119",
	"name": "jiafeitian",
	"humanAddress": "地球"
}

😵由于返回的数据中有部分不符合我们的需求,因此需要手动getset一下,
如果项目中有多个地方都需要调用此接口,那么每调用一次都需要手动修改一下。

entity.setAddress(apiEntity.getHumanAddress());

二. 前期准备

⏹前台发送请求

$.ajax({
    url: "/test01/getCardInfo1",
    type: 'POST',
    data: null,
    contentType: 'application/json;charset=utf-8',
    success: function (data, status, xhr) {
    	debugger;
        console.log(data);
    }
});

⏹第三方接口与第三方实体类

  • 第三方实体类
import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class Card {
	
	private String id;
	
	private String name;
	
	private String mobile;
}
  • 模拟第三方接口
import org.springframework.stereotype.Service;

@Service
public class Test01Service {
	
	// 第三方接口的方法
	public Card getCardInfo() {
		return Card.builder()
				.id("110")
				.name("Test")
				.mobile("110120119")
				.build();
	}
}

三. 解决方式一: @JsonProperty注解

  • 将该注解直接作用于实体类上,标记想要返回的key
  • 此情况适用于能修改其他包实体类的情况下,部分jar包中的代码我们无法修改
  • 在实际业务中,部分代码可能不允许修改
import com.fasterxml.jackson.annotation.JsonProperty;

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class Card {
	
	private String id;
	
	private String name;
	
	// 标记我们想要返回的key的名称
	@JsonProperty("jmw_phone")
	private String mobile;
}

⏹调用

@Controller
@RequestMapping("/test01")
public class Test01Controller {
	
	@Resource
	private Test01Service service;
	
	@PostMapping("/getCardInfo1")
	@ResponseBody
	public Card getCardInfo1() {
		Card cardInfo = service.getCardInfo();
		return cardInfo;
	}
}	

💪可以看到,最终返回的是jmw_phone,而不是mobile

在这里插入图片描述

三. 解决方式二: @JsonProperty + @JsonMixin注解

@JsonMixin注解是Spring Boot 2.7.x之后出现的新特性,可以在不修改已有的Java类库的情况下,定制Json的输出。

3.1 方式1 混入单个类

3.1.1 创建一个被@JsonMixin注解修饰的抽象类

  • Spring Boot的Jackson自动配置将扫描应用程序的包以查找带有@JsonMixin注解的类,
    并将它们注册到自动配置的ObjectMapper中。
  • 我们通过@JsonMixin注解将Card.class这个类混入到CardWarp 中,然后在指定需要被定制的属性中使用@JsonProperty注解来修改返回json时的key。
import org.springframework.boot.jackson.JsonMixin;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

@Data
@JsonMixin(Card.class)
public abstract class CardWarp {
	
	// 自定义返回json的key
	@JsonProperty("jmw_phone")
	private String mobile;
}

3.1.2 调用查看效果

@Controller
@RequestMapping("/test01")
public class Test01Controller {
	
	@Resource
	private Test01Service service;
	
	@PostMapping("/getCardInfo2")
	@ResponseBody
	public Card getCardInfo2() {
		Card cardInfo = service.getCardInfo();
		return cardInfo;
	}
}

💪可以看到,我们只是新创建了CardWarp ,并没有对Card类进行任何改动,
依然能实现效果。

在这里插入图片描述

3.2 方式2 混入多个类

3.2.1 第三方接口中的类

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class Card {
	
	private String id;
	
	private String name;
	
	private String mobile;
}
import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class Person {

	private String personId;

    private String humanName;

    private String age;
}

3.2.2 @JsonMixin注解混入多个类

import org.springframework.boot.jackson.JsonMixin;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

@Data
@JsonMixin({Card.class, Person.class})
public abstract class CardWarp {
	
	// 将Card中的mobile修改为jmw_phone
	@JsonProperty("jmw_phone")
	private String mobile;
	
	// 将Person中的humanName修改为personName
	@JsonProperty("personName")
	private String humanName;
}

3.2.3 定义实体类组合第三方接口中的类

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class Test02Entity {
	
	private String uuid;
	
	// 组合Card 类
	private Card card;
	
	// 组合person类
	private Person person;
}

3.2.4 调用查看效果

@Controller
@RequestMapping("/test01")
public class Test01Controller {
	
	@Resource
	private Test01Service service;
	
	@PostMapping("/getCardInfo3")
	@ResponseBody
	public Test02Entity getCardInfo3() {
		
		return Test02Entity.builder()
				.uuid("X6u8iy&y")
				.card(Card.builder().id("10").mobile("15165244").name("测试").build())
				.person(Person.builder().personId("20").humanName("贾飞天").age("100").build())
				.build();
	}
}

💪可以看到,我们的对key的修改起到了效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/537400.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT初学者最佳实践

2022年11月底,ChatGPT引爆了新一轮AI的革命,也让人们意识到AI真的能够大幅度提高人们的工作效率,甚至有人担心自己的工作会因为AI不保。这种居安思危的意识是正确的,但是正如锛凿斧锯的出现,并没有让木匠这个行业消失&…

音频格式及转换代码

音频信号的读写、播放及录音 python已经支持WAV格式的书写,而实时的声音输入输出需要安装pyAudio(http://people.csail.mit.edu/hubert/pyaudio)。最后我们还将使用pyMedia(http://pymedia.org)进行Mp3的解码和播放。 音频信号是模拟信号,我们需要将其…

纯前端绘制的下雨效果

先上效果&#xff1a; 再上代码&#xff1a; <!--黏糊糊的菜单--> <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><meta name"viewport" content"widt…

Golang笔记:使用os.Args和flag包编写命令行界面(CLIs)

文章目录 目的os.ArgsflagFlagSet总结 目的 命令行界面&#xff08;Command-line Interfaces&#xff09;是比较常用的一种软件形式。对于大部分开发运维人员来说很多时候CLIs可能比图形界面更加方便。软件开发时也经常会有需要开发命令行界面形式软件的情况&#xff0c;使用G…

Maven基础篇

Maven基本概念 Maven是什么 maven的本质是一个项目管理工程&#xff0c;将项目开发和管理过程抽象成一个项目对象模型&#xff08;POM&#xff09; POM&#xff08;Project Object Model&#xff09;&#xff1a;项目对象模型 作用 项目构建&#xff1a;提供标准的、跨平台…

什么是Selenium?如何使用Selenium进行自动化测试

目录 什么是 Selenium&#xff1f; Selenium 的优势是什么? 软件测试的需要 手动测试的挑战 自动化测试胜过手动测试 Selenium 对比 QTP 和 RFT Selenium 工具套件 Selenium 有哪些组件? Selenium RC &#xff08;远程控制&#xff09; Selenium IDE&#xff08;集成…

MIT6824——lab2(实现一个Raft库)的一些实现,问题,和思考

MIT 6824 关于lab2的实现&#xff0c;由于开源许可的问题&#xff0c;代码暂时不开源&#xff0c;下面是自己在实现过程中的思路&#xff0c;遇到的问题&#xff0c;以及总结 1 总结 1.1 raft整个流程 应用程序&#xff1a;kv数据库启动raft库&#xff0c;选举leader&#xf…

跳槽前,把自己逼成卷王...

前段时间席卷全互联网行业的内卷现象&#xff0c;想必有不少人都深陷其中。其实刚开始测试行业人才往往供不应求&#xff0c;而在发展了十几年后&#xff0c;很多人涌入这个行业开始面对存量竞争。红利期过去了&#xff0c;仅剩内部争夺。 即便如此&#xff0c;测试行业仍有许…

AspNetCore中的配置文件详解

1 配置文件 程序开发中&#xff0c;有些信息是要根据环境改变的&#xff0c;比如开发环境的数据库可能是本地数据&#xff0c;而生产环境下需要连接生产数据库&#xff0c;我们需要把这些信息放到程序外面&#xff0c;在程序运行时通过读取这些外部信息实现不改变程序代码适应…

计算机图形学-GAMES101-8

引言 着色是针对某一个点(片段)的应用&#xff0c;这里需要考虑着色的频率。  漫反射项代表光向四面八方均匀的反射出去&#xff0c;和观察方向无关。  Blinn-Phong反射模型结构如下&#xff1a; ) 一、Blinn-Phong模型 &#xff08;1&#xff09;Specular 什么时候才能看到…

SpringBoot实操篇1

一、工程打包与运行&#xff08;windows版&#xff09; 在浏览器中就可以访问到了&#xff0c;此时IDEA并没有启动。服务器就是命令行窗口。 跳过测试&#xff1a;可以看到多了很多数据&#xff0c;是因打包的时候将功能测试了一遍。在IDEA中可以关掉。 注意&#xff1a;必须…

nginx+php+mysql安装以及环境的搭建

目录 一、nginx的安装 二、php的下载安装 1.进入到/usr/local/下&#xff0c;下载php的安装包 2.解压 3.进入到php-8.2.6下&#xff0c;安装需要的依赖包 4.预编译php 5.编译 6.为php提供配置文件 7.为php-fpm提供配置文件 8.添加用户和用户组 9.修改php-fpm.conf配置…

JavaScript全解析-this指向

this指向&#xff08;掌握&#xff09; ●this 是一个关键字&#xff0c;是一个使用在作用域内的关键字 ●作用域分为全局作用域和局部作用域&#xff08;私有作用域或者函数作用域&#xff09; 全局作用域 ●全局作用域中this指向window 局部作用域 ●函数内的 this, 和 函…

OS之作业调度算法

目录 一、基本概念 二、先来先服务算法(FCFS) 三、短作业算法(SJF/SPF) 四、轮转调度算法(RR) 五、优先级调度算法 六、多级反馈队列调度算法 一、基本概念 T(周转)T(完成)-T(到达) 二、先来先服务算法(FCFS) 不利于短作业&#xff0c;非抢占式算法 算法思想&#xff…

Linux日志文件服务器搭建

文章目录 Linux日志文件服务器搭建节点规划案例实施(1)修改主机名(2)配置日志服务器(3)重新启动查看rsyslogd(4)配置客户端(5)测试 Linux日志文件服务器搭建 节点规划 IP主机名节点192.168.100.10serverlog日志服务器192.168.100.20clientlog日志客户端 必须两台机器可以ping…

IPv6之组播地址分类

本文目录 1、IPv6组播地址的结构2、特殊的预留地址和预留组播地址 1、IPv6组播地址的结构 IPv6组播地址是由固定的8bit地址前缀FF::/8&#xff0c;4bit的标志位&#xff0c;4bit组播范围和112bit多播组标识符&#xff08;组ID&#xff09;组成 FF::/8 IPv6的组播地址的最高8bi…

linux环境下设置python定时任务

linux环境下设置python定时任务 Linux 系统提供了使用者控制计划任务的命令 :crontab 命令 1、在linux环境执行命令,进入编辑界面 crontab -e2、按键盘 i 键&#xff0c;进入编辑模式&#xff0c;输入以下内容&#xff0c;设置2个定时任务 定时任务1&#xff1a;每隔10分钟执…

MindFusion.JavaScript Pack 2023.R1 Crack

图表控件添加了径向树布局和套索缩放工具。 2023年5月17日-10:53新版 特征 JavaScript图表中的新增功能 径向树布局-添加了新的类&#xff0c;它将树级别排列在围绕根的同心圆中。 套索缩放工具-控件现在支持使用套索工具进行缩放的几种方法&#xff1a; 可以将行为属性设置为…

单点登录协议

认证和授权 认证&#xff1a;确认该用户的身份是他所声明的那个人 授权&#xff1a;根据用户身份授予他访问特定资源的权限 当用户登录应用系统时&#xff0c;系统需要先认证用户身份&#xff0c;然后依据用户身份再进行授权。认证与授权需要联合使用&#xff0c;才能让用户真…

浏览器网络请求——HTTP详解

文章目录 HTTP 是什么HTTP 发展历程HTTP 1.0HTTP 1.1HTTP 2.0 常用方法头部信息 (Headers)请求头&#xff08;request Headers响应头&#xff08;response Headers&#xff09; 状态码HTTP无状态理解&#xff1a;cookie与session总结 HTTP 是什么 HTTP&#xff08;Hyper Text T…