SSM框架下前后端分离@ResponseBody返回json如何忽略特定属性

发布于 2022-09-06 04:35:12 字数 753 浏览 29 评论 0

model 代码:

public class A{
    private long id;
    private String name;
    private String avatar;
    private int score;
    private B b;

    //......setter and getter
}

controller代码:

@RequestMapping("/A")
@ResponseBody
public A getModel(){
    A a = new A();
    a.setName("one");
    a.setAvatar("avatar.jpg");
    return a;
} 

那么在前端请求/A时就会得到:

{id:0,name:"one",avatar:"avatar.jpg",score:0,b:null}

这不是我希望的结果,我希望前端只能拿到它所需要的name 和 avatar。

不完美的解决方案

用mybatis时,每次查询结果数据,用Map来承载,而不是bean,在Controller中也是如此(甚至可以剔除model层)。但这样就要求对数据库表非常了解,而牺牲了很多便利操作(如 增、改操作)

jackson,@JsonIgnore。不满足要求,需要序列化的Property,并非固定的。这次我要id,name,下次我可能要name,score

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

太阳男子 2022-09-13 04:35:12

通过反射解决了,用字符串的形式设置所有获取的字段名。
通过反射获取到该类和所要获取的字段get方法,保存在一个map中

不寐倦长更 2022-09-13 04:35:12

jackson 字段动态过滤

https://github.com/bohnman/squiggly-filter-jackson
https://github.com/narusas/SpringMvcJacksonFilter
https://github.com/shihyuho/jackson-dynamic-filter

  1. 使用AOP;自己定义注解,然后在返回的时候加上需要过滤的字段.

这是我的工具类 
https://github.com/yujunhao8831/spring-boot-start-current/blob/master/aidijing-common/src/main/java/com/aidijing/common/util/JsonUtils.java
  1. 实现 ResponseBodyAdvice<T> 接口,如果这样,那么就需要使用统一的返回值类型,把之前的返回值包装起来.
    这样在Spring Response 写出去之前,你可以对这些数据进行处理,还是使用jackson的过滤特性.
    我之前就是这样做的, https://github.com/yujunhao88... 你可以参考下

  2. 返回之前就立马进行过滤.
    我之后准备采用这个, https://github.com/yujunhao88...
    你可以参考下,不过这不是最终的,还在完善中

戴着白色围巾的女孩 2022-09-13 04:35:12

可以使用fastJson 对javabean的排除属性设置@JSONField(serialize=false) 前提实现序列化
如果不是固定返回 那么最好在controller返回的时候 使用方法吧bean转成json字符串
方法如下:
/**

  • 从对象中序列化指定字段的json串

  • @param object

  • @param keys 需要序列化的key值

  • @return

 */
public static String object2Json(Object object, String... keys) {
    SimplePropertyPreFilter filter = new SimplePropertyPreFilter(object.getClass(),keys);
    return toJSONString(object,filter, SerializerFeature.WriteMapNullValue);
}
┊风居住的梦幻卍 2022-09-13 04:35:12

你可以重写MappingJackson2HttpMessageConverter,通过判断封装类型为null 不处理,基本数字类型等于0时不处理,或者加个注解

眼泪淡了忧伤 2022-09-13 04:35:12

可以使用jackson的Include.NON_DEFAULT 属性为默认值不序列化
ObjectMapper mapper = new ObjectMapper();

mapper.setSerializationInclusion(Include.NON_NULL);

//通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化
//Include.Include.ALWAYS 默认
//Include.NON_DEFAULT 属性为默认值不序列化
//Include.NON_EMPTY 属性为 空(“”) 或者为 NULL 都不序列化
//Include.NON_NULL 属性为NULL 不序列化

我ぃ本無心為│何有愛 2022-09-13 04:35:12

封装DTO,需要两个字段的时候加一个两个字段的DTO,需要三个字段的时候再整一个相应的DTO

烟─花易冷 2022-09-13 04:35:12

提供一种方案,你查询出结果后过滤一遍,把其他你不要的值设为null。

伴我老 2022-09-13 04:35:12

建议使用fastjson

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文