2011-11-22 34 views
7

Có cách nào để đăng ký bộ lọc thuộc tính chung trong ObjectMapper không? Toàn cầu có nghĩa là nó sẽ được áp dụng cho tất cả các loại đậu được xê-ri hóa. Tôi không thể sử dụng chú thích (tôi không thể sửa đổi các bean đã được tuần tự hóa) và không biết những thuộc tính nào của bean. Bộ lọc phải dựa trên tên.Bộ lọc thuộc tính toàn cầu ở Jackson

Ý tưởng đầu tiên của tôi là viết một bộ nối tiếp tùy chỉnh, nhưng tôi không biết tôi nên truyền cái gì cho hàm tạo.

Trả lời

9

Tôi muốn sử dụng Trình lọc. Đó là một chút tham gia, nhưng không quá khó sử dụng.

import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility; 
import org.codehaus.jackson.annotate.JsonMethod; 
import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.map.ObjectWriter; 
import org.codehaus.jackson.map.annotate.JsonFilter; 
import org.codehaus.jackson.map.ser.FilterProvider; 
import org.codehaus.jackson.map.ser.impl.SimpleBeanPropertyFilter; 
import org.codehaus.jackson.map.ser.impl.SimpleFilterProvider; 

public class JacksonFoo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    Bar bar = new Bar(); 
    bar.id = "42"; 
    bar.name = "James"; 
    bar.color = "blue"; 
    bar.foo = new Foo(); 
    bar.foo.id = "7"; 
    bar.foo.size = "big"; 
    bar.foo.height = "tall"; 

    ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY); 
    System.out.println(mapper.writeValueAsString(bar)); 
    // output: 
    // {"id":"42","name":"James","color":"blue","foo":{"id":"7","size":"big","height":"tall"}} 

    String[] ignorableFieldNames = { "id", "color" }; 

    FilterProvider filters = new SimpleFilterProvider().addFilter("filter properties by name", SimpleBeanPropertyFilter.serializeAllExcept(ignorableFieldNames)); 

    mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY); 
    mapper.getSerializationConfig().addMixInAnnotations(Object.class, PropertyFilterMixIn.class); 
    ObjectWriter writer = mapper.writer(filters); 

    System.out.println(writer.writeValueAsString(bar)); 
    // output: 
    // {"name":"James","foo":{"size":"big","height":"tall"}} 
    } 
} 

@JsonFilter("filter properties by name") 
class PropertyFilterMixIn 
{ 

} 

class Bar 
{ 
    String id; 
    String name; 
    String color; 
    Foo foo; 
} 

class Foo 
{ 
    String id; 
    String size; 
    String height; 
} 

Để biết các cách tiếp cận khác và thông tin khác, tôi khuyên bạn nên sử dụng các tài nguyên sau.

+0

trình như một say mê :) Có rất nhiều chỗ cho sự cải tiến trong các tài liệu Jackson. – DAN

+0

Đối với những người quan tâm, tôi đã đăng nhập một yêu cầu nâng cao tại http://jira.codehaus.org/browse/JACKSON-724 để đơn giản hóa cấu hình cần thiết để lọc các thuộc tính theo tên. –

+0

@DAN Tuyệt đối! Đóng góp được đặc biệt hoan nghênh cho tài liệu! (bao gồm các liên kết đến các bài viết hay, cập nhật wiki) – StaxMan

Các vấn đề liên quan