鍍金池/ 問答/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時就會得到:

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

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

不完美的解決方案

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

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

回答
編輯回答
情已空

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

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. 實現(xiàn) ResponseBodyAdvice<T> 接口,如果這樣,那么就需要使用統(tǒng)一的返回值類型,把之前的返回值包裝起來.
    這樣在Spring Response 寫出去之前,你可以對這些數(shù)據(jù)進行處理,還是使用jackson的過濾特性.
    我之前就是這樣做的, https://github.com/yujunhao88... 你可以參考下

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

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

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

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

可以使用fastJson 對javabean的排除屬性設置@JSONField(serialize=false) 前提實現(xiàn)序列化
如果不是固定返回 那么最好在controller返回的時候 使用方法吧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 屬性為默認值不序列化
ObjectMapper mapper = new ObjectMapper();

mapper.setSerializationInclusion(Include.NON_NULL);

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

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

封裝DTO,需要兩個字段的時候加一個兩個字段的DTO,需要三個字段的時候再整一個相應的DTO

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

建議使用fastjson

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

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

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

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

2017年10月6日 19:26