Bootstrap

springMvc 将对象json返回时自动忽略掉对象中的特定属性的注解方式



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 and ResponseEntity 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);
    }

;