鍍金池/ 問答/Java  數(shù)據(jù)庫  HTML/ SSM框架下前后端分離@ResponseBody返回json如何忽略特定屬性

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

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時(shí)就會(huì)得到:

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

這不是我希望的結(jié)果,我希望前端只能拿到它所需要的name 和 avatar。

不完美的解決方案

用mybatis時(shí),每次查詢結(jié)果數(shù)據(jù),用Map來承載,而不是bean,在Controller中也是如此(甚至可以剔除model層)。但這樣就要求對數(shù)據(jù)庫表非常了解,而犧牲了很多便利操作(如 增、改操作)

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

回答
編輯回答
情已空

jackson 字段動(dòng)態(tài)過濾

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

  1. 使用AOP;自己定義注解,然后在返回的時(shí)候加上需要過濾的字段.

這是我的工具類 
https://github.com/yujunhao8831/spring-boot-start-current/blob/master/aidijing-common/src/main/java/com/aidijing/common/util/JsonUtils.java
  1. 實(shí)現(xiàn) ResponseBodyAdvice<T> 接口,如果這樣,那么就需要使用統(tǒng)一的返回值類型,把之前的返回值包裝起來.
    這樣在Spring Response 寫出去之前,你可以對這些數(shù)據(jù)進(jìn)行處理,還是使用jackson的過濾特性.
    我之前就是這樣做的, https://github.com/yujunhao88... 你可以參考下

  2. 返回之前就立馬進(jìn)行過濾.
    我之后準(zhǔn)備采用這個(gè), https://github.com/yujunhao88...
    你可以參考下,不過這不是最終的,還在完善中

2018年2月24日 02:13
編輯回答
拼未來

你可以重寫MappingJackson2HttpMessageConverter,通過判斷封裝類型為null 不處理,基本數(shù)字類型等于0時(shí)不處理,或者加個(gè)注解

2017年6月26日 23:45
編輯回答
獨(dú)特范

可以使用fastJson 對javabean的排除屬性設(shè)置@JSONField(serialize=false) 前提實(shí)現(xiàn)序列化
如果不是固定返回 那么最好在controller返回的時(shí)候 使用方法吧bean轉(zhuǎn)成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);
}
2018年3月8日 02:24
編輯回答
放開她

可以使用jackson的Include.NON_DEFAULT 屬性為默認(rèn)值不序列化
ObjectMapper mapper = new ObjectMapper();

mapper.setSerializationInclusion(Include.NON_NULL);

//通過該方法對mapper對象進(jìn)行設(shè)置,所有序列化的對象都將按改規(guī)則進(jìn)行系列化
//Include.Include.ALWAYS 默認(rèn)
//Include.NON_DEFAULT 屬性為默認(rèn)值不序列化
//Include.NON_EMPTY 屬性為 空(“”) 或者為 NULL 都不序列化
//Include.NON_NULL 屬性為NULL 不序列化

2017年12月26日 05:17
編輯回答
囍槑

封裝DTO,需要兩個(gè)字段的時(shí)候加一個(gè)兩個(gè)字段的DTO,需要三個(gè)字段的時(shí)候再整一個(gè)相應(yīng)的DTO

2018年6月15日 11:50
編輯回答
裸橙

建議使用fastjson

2017年8月9日 07:55
編輯回答
孤酒

提供一種方案,你查詢出結(jié)果后過濾一遍,把其他你不要的值設(shè)為null。

2017年11月29日 08:05
編輯回答
司令

通過反射解決了,用字符串的形式設(shè)置所有獲取的字段名。
通過反射獲取到該類和所要獲取的字段get方法,保存在一個(gè)map中

2017年10月6日 19:26