Json Serialize 忽略特定屬性


Json Serialize 忽略特定屬性

Json Serialize SerializeFilter 忽略特定屬性

key words:Json Serialize jackson fastjson springmvc responsebody lodash

問題描述

SpringMVC中直接可以返回經過序列化的對象,只需要在Controller上加上 @ResponseBody
例如:

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。

  1. 我不希望暴露后端bean的所有Properties
  2. 基本類型都被賦予了默認值0,這也許會給前端造成誤解。例如score在數據庫里本來是100,但序列化時附帶了score=0
  3. 返回了大量無意義的、潛藏危險的數據

有缺陷的解決方案

能想到的解決方案有如下:

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

2.返回時,新建ViewModel,用ViewModel來過濾。比較麻煩

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

4.使用fastjson的SerializeFilter ,具體見這里。還是有點缺陷,遇到多層次引用就不知道怎么辦了:List< A > ,A包含B,過濾了A,卻暴露了B。(可能是沒深入研究。。。。)

@RequestMapping("/A")
@ResponseBody
public String getModel(){
	//A a
	SimplePropertyPreFilter filter = new SimplePropertyPreFilter(); // 構造方法里,也可以直接傳需要序列化的屬性名字
	filter.getExcludes().add("id");
	filter.getExcludes().add("score");
	return JSON.toJSONString(a, filter);
}

不知道java里面有沒有類似於lodash.js 中的pick函數的方法,可能javascript里面是弱對象,所以實現和效率都不成問題吧。

貼一段代碼求java解決方案:

//載入lodash.js
var _   = require('lodash');

ep.all('topics', function (topics) {
    topics.forEach(function (topic) {
      UserModel.findById(topic.author_id, ep.done(function (author) {
        if (mdrender) {
          topic.content = renderHelper.markdown(at.linkUsers(topic.content));
        }
        topic.author = _.pick(author, ['loginname', 'avatar_url']);
        ep.emit('author');
      }));
    });

    ep.after('author', topics.length, function () {
      topics = topics.map(function (topic) {
        return _.pick(topic, ['id', 'author_id', 'tab', 'content', 'title', 'last_reply_at',
          'good', 'top', 'reply_count', 'visit_count', 'create_at', 'author']);
      });

      res.send({data: topics});
    });
});


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM