Java接口返回json如何忽略特定属性
作者:CNBLOG 发布时间:2022-03-16 07:54:24
经常遇到的问题
在实际得开发过程中,我们经常会遇到以下场景,我们后端请求某个接口后获取到得数据,不希望将所有字段都返回给前端,那么我们需要封装,或者过滤一些不必要得字段后返回给前端。
不完美的解决方案
使用 Jackson 字段动态过滤
@JsonIgnore用于忽略序列化和反序列化中使用的逻辑属性。@JsonIgnore 可用于 setter、getter 或字段。
@JsonIgnoreProperties忽略 JSON 序列化和反序列化中的指定逻辑属性。它在类级别进行了注释。
@JsonIgnoreType在类级别进行了注释,它忽略了整个类。
@JsonInclude(JsonInclude.Include.NON_NULL) 属性为NULL不序列化,即不返回给前端
以上方式都不满足实际要求,需要序列化的Property,并非固定的。这次我要id,name,下次我可能要name,score。
通过SimplePropertyPreFilter方式(Json返回)
这种写法,接口返回类型就要求是Json字符串类型。无法满足Spring注解@ResponseBody。
场景一: 只保留name和sex字段
public static void main(String[] args) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "jhon");
jsonObject.put("age", 18);
jsonObject.put("sex", "男");
jsonObject.put("phone", "1111111");
jsonObject.put("email","142qq.com");
System.out.println(jsonObject);
// SimplePropertyPreFilter filter = new SimplePropertyPreFilter("name","sex");
SimplePropertyPreFilter filter = new SimplePropertyPreFilter();
filter.getIncludes().add("name");
filter.getIncludes().add("sex");
System.out.println(JSONObject.toJSONString(jsonObject, filter));
}
// 或者调用以下方式
public static String object2Json(Object object, String... keys) {
SimplePropertyPreFilter filter = new SimplePropertyPreFilter(object.getClass(),keys);
return JSONObject.toJSONString(object,filter, SerializerFeature.WriteMapNullValue);
}
场景二: 过滤掉email和phone字段
public static void main(String[] args) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "jhon");
jsonObject.put("age", 18);
jsonObject.put("sex", "男");
jsonObject.put("phone", "1111111");
jsonObject.put("email","142qq.com");
System.out.println(jsonObject);
SimplePropertyPreFilter filter = new SimplePropertyPreFilter();
filter.getExcludes().add("email");
filter.getExcludes().add("phone");
System.out.println(JSONObject.toJSONString(jsonObject, filter));
}
@ResponseBody返回json如何忽略特定属性
@RequestBody注解标记接收前端传递给后端的json数据,然后转成对象。
@ResponseBody注解标记是把后端返回的对象转换成json数据,然后传递给前端。
我们想要的效果是将查询得到的 List<对象> 动态过滤指定的字段
但实际上我们得到的对象还会再封装一层:return new IResult(list);
使用AOP,通过自定义注解的方式来控制动态过滤指定字段。(实现太麻烦放弃了)
通过反射Map解决
通过反射获取到该类和所要获取的字段get方法,保存在一个map中。但当数据量大的情况再把对象转换一次map,就会影响接口性能了。(此方式不可取)
最终解决办法:定义查询列表数据的接口,用Map来承载,而不是bean。
public List<Map<String,Object>> list(Entity entity);
不同接口参数使用相同对象展示不同参数
当我们在写接口的时候,一个实体类对象会被多个接口使用,但每个接口要求的参数可能都不一样。为了接口参数规范,于是我们就重写了多个实体类,对应不同的接口。(相信很多人目前是偷懒每套业务都只用了一个实体类对象吧,前端自己挑选所需要的字段)
但是提供给第三方的接口,参数和结果字段必须都要求规范起来,否则等着被喷了。
Swagger2实现参数使用相同对象展示不同参数,可以用分组方式实现,但用起来也比较麻烦。
还会遇到每个接口需要做字段校验@Valid,又是麻烦的一批。
最终发现还是多写几个实体类更快更规范此,且针对不同接口的参数也更便于管理。
来源:https://www.cnblogs.com/zhaojinhui/p/16723075.html
猜你喜欢
- 本文实例讲述了C#画图之饼图折线图的实现方法,是C#程序设计中非常实用的技巧。分享给大家供大家参考。具体方法分析如下:显示图像的控件定义如下
- 本文实例为大家分享了java贪吃蛇游戏展示的具体代码,供大家参考,具体内容如下1、采用MVC(model、view、control)框架模式
- 本文实例为大家分享了Java实现简易俄罗斯方块的具体代码,供大家参考,具体内容如下一、将对象抽象为类首先考虑俄罗斯方块游戏中含有哪些具体的对
- 相关api见:点击进入/* * Copyright 2014 the original author or authors. * * Lic
- 数组与链表的比较:数组通过下标访问的话是O(1)数组一旦声明 长度就是固定的数组的数据是物理逻辑均连续的链表增删要快一些, 数组遍历快一些长
- 背景前段时间同事碰到一个问题,需要在 SpringCloud 的 Feign 调用中使用自定义的 URL;通常情况下是没有这个需求的;毕竟都
- 上一篇JavaMail入门第三篇 发送邮件中,我们学会了如何用JavaMail API提供的Transport类发送邮件,同样,JavaMa
- Map映射Map映射是一个java集合存储在键 - 值对的元素,并且不允许在列表中重复的元素。 Map接口提供三种collection视图,
- 前言设计模式在我看来更像是一种设计思维或设计思想,它就像《孙子兵法》一样,为你的项目工程提供方向,让你的项目工程更加健壮、灵活,延续生命力。
- 这篇文章主要介绍了java 对象参数去空格方式代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 安装hbase首先下载hbase的最新稳定版本 http://www.apache.org/dyn/closer.cgi/hbas
- 今日遇到一个问题:springboot需要获取到一个自定义名称文件夹下的静态资源(图片等),并且文件夹的路径不在classPath下面,而是
- 1.SpringBoot AOP功能1.1 LTW与不同的切面织入时机AOP——面向切面编程,通过为
- 如执行:"2|33|4".split("|")出来的结果是:""2334奇怪吧,
- 这篇文章主要介绍了java内存泄漏与内存溢出关系解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- SpringCloud简介Spring cloud是一个基于Spring Boot实现的服务治理工具包,在微服务架构中用于管理和协调服务的微
- 下面是我做C#第一个项目的过程:1.首先打开VS,这里我用的是VS2022预览版,鼠标双击打开VS;图一2.打开VS后会出现下面的页面,鼠标
- 这篇文章主要介绍了基于Java检查IPv6地址的合法性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 如果出现:org.apache.ibatis.binding.BindingException: Invalid bound stateme
- 前言需求是上传Excel文件并读取Excel文件中的内容,根据获取的数据执行完某些业务操作后再将一些数据写回到excel中。前台使用Form