Jackson – Loại bỏ các thuộc tính khi chuyển Object sang Json

Bài viết này chúng ta sẽ cùng nhau tìm hiểu cách loại bỏ(ignore) các thuộc tính trong Java object khi chuyển sang Json (Serialization). Mặc định, Jackson sẽ chuyển tất cả các thuộc tính của object sang json, nếu không muốn một số thuộc tính tham gia vào quá trình này, chúng ta sẽ phải chỉ định rõ bằng các công cụ mà Jackson đã cung cấp.

Ignore field at the Class Level

Chúng ta có thể loại bỏ các thuộc tính tại class-level thông qua @JsonIgnoreProperties và chỉ định tên các thuộc tính cần loại bỏ.

Ví dụ tạo MyDto class và loại bỏ thuộc tính intValue khi serialization.

@JsonIgnoreProperties(value = { "intValue" })
public class MyDto {
 
    private String stringValue;
    private int intValue;
    private boolean booleanValue; 
    // standard setters and getters are not shown
}

Như vậy, kết quả của quá trình serialization sẽ không chứa thuộc tính intValue.

ObjectMapper mapper = new ObjectMapper();
MyDto dtoObject = new MyDto("string", 1, true);

String dtoAsString = mapper.writeValueAsString(dtoObject);
System.out.println(dtoAsString);
// {"stringValue":"string","booleanValue":true}

Ignore field at the Field Level

Một nhược điểm khi sử dụng @JsonIgnoreProperties là chúng ta phải thay đổi tên các thuộc tính được liệt kê trong @JsonIgnoreProperties khi tên các thuộc tính của class bị thay đổi. Để giải quyết vấn đề này, chúng ta có thể sử dụng @JsonIgnore để ignore chúng trực tiếp tại field level.

public class MyDto {

    private String stringValue;
    @JsonIgnore
    private int intValue;
    private boolean booleanValue;
    // standard setters and getters are not shown
}

Chúng ta cũng sẽ có kết quả tương tự với @JsonIgnoreProperties.

ObjectMapper mapper = new ObjectMapper();
MyDto dtoObject = new MyDto("string", 1, true);

String dtoAsString = mapper.writeValueAsString(dtoObject);
System.out.println(dtoAsString);
// {"stringValue":"string","booleanValue":true}

Ignore All Fields by Type

Để loại bỏ tất cả các thuộc tính của một class trong serialization, chúng ta có thể sử dụng @JsonIgnoreType, thông thường ingore các class có mối quan hệ has-a.

Ví dụ ignore tất cả các thuộc tính của Name class khi serialization User object.

public class User {
    public int id;
    public Name name;

    public User(int id, Name name) {
        this.id = id;
        this.name = name;
    }

    @JsonIgnoreType
    public static class Name {
        public String firstName;
        public String lastName;

        public Name(String firstName, String lastName) {
            this.firstName = firstName;
            this.lastName = lastName;
        }
    }
}
User.Name name = new User.Name("John", "Doe");
User user = new User(1, name);
 
String result = new ObjectMapper()
        .writeValueAsString(user); // {"id":1}

Ngoài ra, chúng ta còn một cách khác là sử dụng MixIn. Định nghĩa MyMixInForIgnoreType empty class với @JsonIgnoreType.

Note: MixIn không thể sử dụng với inner class.

public class Item {
    public int id;
    public String itemName;
    public User owner;
 
    public Item(int id, String itemName, User owner) {
        this.id = id;
        this.itemName = itemName;
        this.owner = owner;
    }
}
 
public class User {
}
 
@JsonIgnoreType
public class MyMixInForIgnoreType {
}

Lược bỏ các giá trị của thuộc tính onwer kiểu User class với 

mapper.addMixIn(User.class, MyMixInForIgnoreType.class);

Kết quả:

Item item = new Item(1, "book", null);
 
String result = new ObjectMapper().writeValueAsString(item);
System.out.println(result); // {"id":1,"itemName":"book","owner":null}
 
ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(User.class, MyMixInForIgnoreType.class);
 
result = mapper.writeValueAsString(item);
System.out.println(result); // {"id":1,"itemName":"book"}

Ignore Field Using Filter

Cuối cùng, chúng ta cũng có thể sử dụng Jackson filter để loại bỏ các thuộc tính trong serialization. Đầu tiên chúng ta định nghĩa một class với @JsonFilter

@JsonFilter("myFilter")
public class BeanWithFilter {
    public int id;
    public String name;
 
    public BeanWithFilter(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

Ví dụ Chỉ lấy các thuộc tính name BeanWithFilter object, bỏ qua tất cả các thuộc tính khác.

BeanWithFilter bean = new BeanWithFilter(1, "my bean");
 
FilterProvider filters
        = new SimpleFilterProvider().addFilter(
        "myFilter",
        SimpleBeanPropertyFilter.filterOutAllExcept("name"));
 
String result = new ObjectMapper()
        .writer(filters)
        .writeValueAsString(bean);
System.out.println(result); // {"name":"my bean"}

Tóm lược

Như vậy, trong bài viết này chúng ta đã biết được cách loại bỏ các field không cần thiết khi chuyển từ Java object sang Json. Đây là một trong những nhu cầu cơ bản khi làm việc với Json, hy vọng sẽ giúp ích cho các bạn.

Nguồn tham khảo

https://www.baeldung.com/jackson-ignore-properties-on-serialization

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x