1.注解使用在 类名,接口头上
@JsonIgnoreProperties(value={"comid"}) //希望动态过滤掉的属性
例
@JsonIgnoreProperties(value={"comid"})
public interface CompanyFilter{
}
2。该注解使用在get方法头上
@JsonIgnore
例
@JsonIgnore
public Integer getPageSize(){
return Integer.valueOf(getRows()==null?"0":getRows().toString());
}
-------------------------------
除了上面,下面有动态的@JsonView
- Jackson’s
@JsonView
is supported directly on@ResponseBody
andResponseEntity
controller methods for serializing different amounts of detail for the same POJO (e.g. summary vs. detail page). This is also supported with View-based rendering by adding the serialization view type as a model attribute under a special key. See the section called “Jackson Serialization View Support” for details.
@RestController
public class UserController {
@RequestMapping(path = "/user", method = RequestMethod.GET)
@JsonView(User.WithoutPasswordView.class)
public User getUser() {
return new User("eric", "7!jd#h23");
}
}
public class User {
public interface WithoutPasswordView {};
public interface WithPasswordView extends WithoutPasswordView {};
private String username;
private String password;
public User() {
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
@JsonView(WithoutPasswordView.class)
public String getUsername() {
return this.username;
}
@JsonView(WithPasswordView.class)
public String getPassword() {
return this.password;
}
}
----------
然后在把他加入到model的过程
可以这么写
@Controller
public class UserController extends AbstractController {
@RequestMapping(path = "/user", method = RequestMethod.GET)
public String getUser(Model model) {
model.addAttribute("user", new User("eric", "7!jd#h23"));
model.addAttribute(JsonView.class.getName(), User.WithoutPasswordView.class);
return "userView";
}
}
------
下面是测试
public static void main(String[] args) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
//创建对象
User user = new User("user1","123456");
//序列化
ByteArrayOutputStream bos = new ByteArrayOutputStream();
objectMapper.writerWithView(User.WithoutPasswordView.class).writeValue(bos, user);
System.out.println(bos.toString());
bos.reset();
objectMapper.writerWithView(User.WithPasswordView.class).writeValue(bos, user);
System.out.println(bos.toString());
}
输出的答案是
{"username":"user1"}
{"username":"user1","password":"123456"}
------
当然spring也有提供基于xml的配置方法,详情看文档的内容
http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#mvc-ann-jsonview
也有人用aop的around中去过滤结果.
-------------------------------
gson 版本
GSON 是Google发布的 JSON 序列化/反序列化工具,非常容易使用。本文简要讨论在使用GSON将Java对象转成JSON时,如何排除某些字段。
最简单的用法
假设有下面这个类:
class MyObj {
public int x;
public int y;
public MyObj(int x, int y) {
this.x = x;
this.y = y;
}
}
最简单的GSON用法如下所示:
@Test
public void gson() {
MyObj obj = new MyObj(1, 2);
String json = new Gson().toJson(obj);
Assert.assertEquals("{\"x\":1,\"y\":2}", json);
}
方法1:排除transient字段
这个方法最简单,给字段加上 transient 修饰符就可以了,如下所示:
class MyObj {
public transient int x; // <---
public int y;
public MyObj(int x, int y) {
this.x = x;
this.y = y;
}
}
@Test
public void gson() {
MyObj obj = new MyObj(1, 2);
String json = new Gson().toJson(obj);
Assert.assertEquals("{\"y\":2}", json); // <---
}
方法2:排除Modifier为指定类型的字段
这个方法需要用GsonBuilder定制一个GSON实例,如下所示:
class MyObj {
protected int x; // <---
public int y;
public MyObj(int x, int y) {
this.x = x;
this.y = y;
}
}
@Test
public void gson() {
Gson gson = new GsonBuilder()
.excludeFieldsWithModifiers(Modifier.PROTECTED) // <---
.create();
MyObj obj = new MyObj(1, 2);
String json = gson.toJson(obj); // <---
Assert.assertEquals("{\"y\":2}", json);
}
方法3:使用@Expose注解
注意,没有被 @Expose 标注的字段会被排除,如下所示:
class MyObj {
public int x;
@Expose public int y; // <---
public MyObj(int x, int y) {
this.x = x;
this.y = y;
}
}
@Test
public void gson() {
Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation() // <---
.create();
MyObj obj = new MyObj(1, 2);
String json = gson.toJson(obj);
Assert.assertEquals("{\"y\":2}", json);
}
方法4:使用ExclusionStrategy定制字段排除策略
这种方式最灵活,下面的例子把所有以下划线开头的字段全部都排除掉:
class MyObj {
public int _x; // <---
public int y;
public MyObj(int x, int y) {
this._x = x;
this.y = y;
}
}
@Test
public void gson() {
ExclusionStrategy myExclusionStrategy = new ExclusionStrategy() {
@Override
public boolean shouldSkipField(FieldAttributes fa) {
return fa.getName().startsWith("_");
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
};
Gson gson = new GsonBuilder()
.setExclusionStrategies(myExclusionStrategy) // <---
.create();
MyObj obj = new MyObj(1, 2);
String json = gson.toJson(obj);
Assert.assertEquals("{\"y\":2}", json);
}