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。
- 我不希望暴露后端bean的所有Properties
- 基本类型都被赋予了默认值0,这也许会给前端造成误解。例如score在数据库里本来是100,但序列化时附带了score=0
- 返回了大量无意义的、潜藏危险的数据
有缺陷的解决方案
能想到的解决方案有如下:
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});
});
});
Json Serialize 忽略特定属性的更多相关文章
- Asp.net MVC5 返回json数据忽略序列化属性
在属性上添加 [ScriptIgnore] 特性,命名空间是System.Web.Script.Serialization
- Json.net 忽略实体某些属性的序列化
遇到了一个小问题有一个用户类,结构和数据库一模一样,里面包含用户密码,要向前台返回用户信息的json数据,但是不能输出密码这个字段.之前的做法是 重新又建了一个不包含这个字段的新类,然后深度复制,总感 ...
- Newtonsoft.Json高级用法 1.忽略某些属性 2.默认值的处理 3.空值的处理 4.支持非公共成员 5.日期处理 6.自定义序列化的字段名称
手机端应用讲究速度快,体验好.刚好手头上的一个项目服务端接口有性能问题,需要进行优化.在接口多次修改中,实体添加了很多字段用于中间计算或者存储,然后最终用Newtonsoft.Json进行序列化返回数 ...
- json转化的时候如何忽略某些属性字段值
一.有时候在将对象或list对象转化为json的时候,我们可能不需要所有的属性值,这就需要我们去过滤掉这些属性了 我下面说两种比较流行的json包如何来忽略某些属性值 二. 使用jaskson包 1. ...
- C# Newtonsoft.Json JObject移除属性,在序列化时忽略
原文 C# Newtonsoft.Json JObject移除属性,在序列化时忽略 一.针对 单个 对象移除属性,序列化时忽略处理 JObject实例的 Remove() 方法,可以在 指定序列化时移 ...
- JS 取Json数据中对象特定属性值
解析JSON JSON 数据 var str = '[{"a": "1","b": "2"}, {"a&quo ...
- @JSON(serialize=false),过滤不需要的变量
@JSON(serialize=false),过滤不需要的变量 在用struts2返回json类型的数据时,json会自动转换需要转换成json形式的变量,如果哪个变量不需要的话,则可以在该变量的 ...
- JavaScript对Json的增删改属性
<script type="text/javascript"> var json = { "age":24, "name":&q ...
- Android studio 开发中 用git实现批量忽略特定文件的方法
git实现批量忽略特定文件的方法 在用AndroidStudio开发项目的时候,3个人协同开发,那么用Git同步代码,会将模块中的大量iml文件同步,每次都会提交和更新,一个一个的去忽略他们,显然是最 ...
随机推荐
- vs C#数据库导入EXCLE
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- 网页热力图 heatmap js
HBuilder +js 实现网页热力图 废话不多说,上代码 <!DOCTYPE html> <html> <head> <title>111</ ...
- Nginx+Tomcat+Memcached集群
Tomcat集群session同步方案有以下几种方式: 使用tomcat自带的cluster方式,多个tomcat间自动实时复制session信息,配置起来很简单.但这个方案的效率比较低,在大并发下表 ...
- DevExpress 中 WaitForm 使用
第一步: 在程序中拖入: splashScreenManager1 控件 在需要处理的地方 使用以下语句来打开 WaitForm窗体(当然需要在 splashScreenManager1控件中绑定一个 ...
- [terry笔记]更改oracle用户名
更改oracle的用户名 之前有个需求,整理一个schema的表.索引等规划到一个表空间里,利用expdp/impdp然后remap就完成了,但是整理好的用户名remap变更了,应用又不想修改其连接信 ...
- 用Python作GIS之五:从示例入手—example函数
进入STARS后,最简单的学习方法就是演示示例数据.对于源码的分析也可以从这里入手. 以下为出发菜单项“Example Project”的函数example:def example(se ...
- Linux内核学习笔记——VFS
概念: ①硬链接:若一个 inode 号对应多个文件名,则称这些文件为硬链接.即硬链接就是同一个文件使用了多个别名.硬链接可由命令 link 或 ln 创建. 其特性: 文件有相同的 inode 及 ...
- 深度理解依赖注入(Dependence Injection)
前面的话:提到依赖注入,大家都会想到老马那篇经典的文章.其实,本文就是相当于对那篇文章的解读.所以,如果您对原文已经有了非常深刻的理解,完全不需要再看此文:但是,如果您和笔者一样,以前曾经看过,似乎看 ...
- “后PC”时代来临
“后PC”时代来临 数年前,喜达屋酒店及度假村国际集团将总部搬迁至美国康涅狄格州斯坦福,这也让公司首席执行官Frits van Paasschen有机会“除尘换新”. 那么,Frits van Paa ...
- 从零开始学ios开发(四):IOS控件(1),Image View、Text Field、Keyboard
长话短说,谢谢大家的关注,这篇写了好长时间,下面继续学习ios.我将用2到3篇的篇幅来学习iphone上的一些常用控件,包括Image View.Text Field.Keyboard.Slider等 ...