2014-09-17 12 views
7

Chciałbym zdefiniować moją niestandardową strategię serializacji (które pola mają zawierać), używając Jackson. Wiem, że mogę to zrobić za pomocą widoków/filtrów, ale wprowadza to bardzo złe rzeczy - używanie reprezentacji łańcuchowej nazw pól, co automatycznie powoduje problemy z autorefaktoryzacją.Jackson: jak serializować tylko adnotowane właściwości?

Jak zmusić Jacksona do serializowania tylko adnotowanych właściwości i nic więcej?

+0

Co można łatwo zrobić, to ** Nie ** szeregować według właściwości adnotacji używając '@ JsonIgnore'. – Mena

+0

@Mena Nie jest wcale dobra - zmusza mnie to do opisywania klas bazowych. Nie chcę tego robić. –

+0

"Zmusza mnie to do adnotowania klas bazowych" -> Nie widzę, jak to się stało. Adnotujesz swoje właściwości, aby je ignorować i skończysz, twój obiekt serializuje ze wszystkimi rekwizytami, z wyjątkiem tych, które są ignorowane. – Mena

Odpowiedz

12

Jeśli wyłączysz automatyczne wykrywanie, powinno ono tylko serializować właściwości, które masz przypisane - niezależnie od tego, czy są to same właściwości, czy też pobierające. Oto prosty przykład:

private ObjectMapper om; 

@Before 
public void setUp() throws Exception { 
    om = new ObjectMapper(); 
    // disable auto detection 
    om.disable(MapperFeature.AUTO_DETECT_CREATORS, 
      MapperFeature.AUTO_DETECT_FIELDS, 
      MapperFeature.AUTO_DETECT_GETTERS, 
      MapperFeature.AUTO_DETECT_IS_GETTERS); 
    // if you want to prevent an exception when classes have no annotated properties 
    om.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); 
} 

@Test 
public void test() throws Exception { 
    BlahClass blahClass = new BlahClass(5, "email", true); 
    String s = om.writeValueAsString(blahClass); 
    System.out.println(s); 
} 

public static class BlahClass { 
    @JsonProperty("id") 
    public Integer id; 
    @JsonProperty("email") 
    public String email; 
    public boolean isThing; 

    public BlahClass(Integer id, String email, boolean thing) { 
     this.id = id; 
     this.email = email; 
     isThing = thing; 
    } 
} 
+1

Działa jako urok. Jesteś najlepsza! –

+0

Tylko wspomnieć: wymaga ** com.fasterxml.jackson.core.jackson-databind ** maven artifact-o. –

+0

Dziękujemy za udzielenie odpowiedzi. Jackson serializuje dokładnie tak, jak chcę, bez konieczności przechodzenia przez Mixin lub CustomSerializer. – TemarV

0

W przypadku, gdy chcesz to zrobić bez konfigurowania mapowania tylko dla określonego typu:

@JsonAutoDetect(
    fieldVisibility = Visibility.NONE, 
    setterVisibility = Visibility.NONE, 
    getterVisibility = Visibility.NONE, 
    isGetterVisibility = Visibility.NONE, 
    creatorVisibility = Visibility.NONE 
) 
public class BlahClass { 
    @JsonProperty("id") 
    private Integer id; 
    @JsonProperty("email") 
    private String email; 
} 
Powiązane problemy