2012-04-20 13 views
6

Ich denke Jackson tut Methode Serialisierung, gibt es eine Möglichkeit, ich könnte es Feld basiert machen?Jackson Feld basierte Serialisierung

Ex:

class Bean { 
    Integer i; 
    String s; 

    public Integer getI() { return this.i; } 
    public void setI(Integer i) { this.i = i; } 
    public bool isSetI() { return this.i != null; } 

    // same for s as well 
} 

Der Ausgang JSON hat "i" und "SETI". Gibt es das überhaupt, könnte ich das überschreiben, um nur "i" zu bekommen? Es wäre auch toll, wenn es eine Möglichkeit gäbe, dies ohne Hinzufügen von Anmerkungen zur Klasse zu tun (sie werden automatisch generiert).

+1

Dieser Code wird nicht kompiliert. Können Sie den tatsächlichen Code, den Sie verwenden, sowie die Art der Serialisierung veröffentlichen? –

Antwort

5

dies ohne Anmerkungen erreichen Sie die ObjectMapper vor Serialisierung/Deserialisierung auf folgende Weise konfigurieren:

ObjectMapper om = new ObjectMapper(); 
om.setVisibilityChecker(om.getSerializationConfig().getDefaultVisibilityChecker(). 
      withGetterVisibility(JsonAutoDetect.Visibility.NONE). 
      withSetterVisibility(JsonAutoDetect.Visibility.NONE)); 
6

Jackson kann Felder auch verwenden, ja; Standardmäßig werden jedoch nur öffentliche Felder erkannt. Sie können jedoch @JsonProperty verwenden, um nicht öffentliche Felder zu markieren.

Eine Sache zu beachten ist, dass, wenn es sowohl eine Methode (setX, getX) und Feld (x) gibt, Methode Vorrang hat. Dies ist normalerweise kein Problem, aber wenn dies der Fall ist, müssen Sie die Methode (n), die nicht verwendet werden soll, explizit deaktivieren, indem Sie ihnen @JsonIgnore enxt hinzufügen.

10

Überprüfen Sie die @ JsonAutoDetect Annotation. Beispiel:

@JsonAutoDetect(fieldVisibility=Visibility.ANY, getterVisibility=Visibility.NONE, isGetterVisibility=Visibility.NONE, setterVisibility=Visibility.NONE) 
public class Bean { 
    Integer i; 
    String s; 

    Integer getI() { return this.i; } 
    void setI(Integer i) { this.i = i; } 
    bool isSetI() return { this.i == null; } 

    // same for s as well 
} 
3

Die akzeptierte Antwort produziert nicht für mich das erwartete Ergebnis. Was funktioniert für mich ohne Anmerkungen hinzuzufügen, ist die ObjectMapper auf folgende Weise konfigurieren:

ObjectMapper om = new ObjectMapper() 
     .setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE) 
     .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); 

Dies ist der Weg, die mehr Sinn für mich scheint zu machen, die die Felder anstelle von Getter \ Setter wie Standard-Java-Serialisierung verwendet würde machen.

Verwandte Themen