2011-11-22 13 views
7

Czy istnieje sposób na zarejestrowanie globalnego filtru właściwości w ObjectMapper? Globalny oznacza, że ​​zostanie zastosowany do wszystkich serializowanych komponentów bean. Nie mogę używać adnotacji (nie mogę modyfikować serializowanych komponentów) i nie wiem, jakie właściwości mają komponenty bean. Filtrowanie powinno opierać się na nazwach.Globalny filtr właściwości w Jackson

Moim pierwszym pomysłem było napisanie niestandardowego serializera, ale nie wiem, co powinienem przekazać konstruktorowi.

Odpowiedz

9

Chciałbym skorzystać z FilterProvider. Jest trochę zaangażowany, ale nie jest zbyt nieporęczny.

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; 
} 

Dla innych podejść i więcej informacji, polecam następujące zasoby.

+0

działa jak czar :) Jest tam dużo miejsca dla poprawy docs Jackson. – DAN

+0

Dla zainteresowanych, zarejestrowałem żądanie rozszerzenia na http://jira.codehaus.org/browse/JACKSON-724, aby uprościć konfigurację potrzebną do filtrowania właściwości według nazwy. –

+0

@DAN Absolutnie! Składki są ZAPRASZAMY mile widziane w dokumentacji! (w tym linki do dobrych artykułów, aktualizacje wiki) – StaxMan

Powiązane problemy