@JsonView是jackson json中的一個注解,spring webmvc也支持這個注解。
這個注解的作用就是控制輸入輸出后的json.
假設我們有一個用戶類,其中包含用戶名和密碼,一般情況下如果我們需要序列化用戶類時,密碼也會被序列化,在一般情況下我們肯定不想見到這樣的情況。但是也有一些情況我們需要把密碼序列化,如何解決這兩種不同的情況呢?
使用@JsonView就可以解決。
看下面的簡單例子:
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; } }
有這樣一個簡單的User對象,包含兩個簡單的屬性。
在這個對象中定義了兩個接口,其中WithoutPasswordView指的就是不帶密碼的視圖,WithPasswordView指的是帶密碼的視圖,並且繼承了WithoutPasswordView的視圖。
@JsonView 中的這個視圖不僅可以用接口,也可以是一般的類,或者說只要有Class屬性就能當成視圖使用。
類或接口間的繼承,也是視圖之間的繼承,繼承后的視圖會包含上級視圖注解的方法。
@JsonView 可以寫到方法上或者字段上。
下面通過代碼測試上面的User對象:
public static void main(String[] args) throws IOException { ObjectMapper objectMapper = new ObjectMapper(); //創建對象 User user = new User("isea533","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()); }
先創建一個objectMapper,然后通過writerWithView工廠方法創建一個指定視圖的ObjectWritter,然后通過writeValue輸出結果。
輸出結果:
{"username":"isea533"}
{"username":"isea533","password":"123456"}
@JsonView 使用起來就是這么簡單,沒有太復雜的東西。
@JsonView 屬性可以寫在注解上,這點不知道是否類似Spring中的自定義注解,如果有了解的人可以留言,謝謝。
另外在Spring-webmvc中使用@JsonView 時要注意,雖然該注解允許指定多個視圖,但是spring-webmvc只支持一個參數(視圖)。
