it-swarm.com.de

Wann wird die Eigenschaft @JsonProperty verwendet und wofür wird sie verwendet?

Diese Bohne 'State':

public class State {

    private boolean isSet;

    @JsonProperty("isSet")
    public boolean isSet() {
        return isSet;
    }

    @JsonProperty("isSet")
    public void setSet(boolean isSet) {
        this.isSet = isSet;
    }

}

wird über den Ajax-Callback "Erfolg" gesendet:

        success : function(response) {  
            if(response.State.isSet){   
                alert('success called successfully)
            }

Ist die Annotation @JsonProperty hier erforderlich? Was ist der Vorteil davon? Ich denke, ich kann diese Anmerkung entfernen, ohne irgendwelche Nebenwirkungen zu verursachen.

Lesen Sie mehr über diese Anmerkung unter https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations Ich weiß nicht, wann dies verwendet werden muss?

144
blue-sky

Hier ist ein gutes Beispiel. Ich benutze es, um die Variable umzubenennen, da JSON aus einer .Net - Umgebung stammt, in der Eigenschaften mit einem Großbuchstaben beginnen.

public class Parameter {
  @JsonProperty("Name")
  public String name;
  @JsonProperty("Value")
  public String value; 
}

Das analysiert korrekt zu/von dem JSON:

"Parameter":{
  "Name":"Parameter-Name",
  "Value":"Parameter-Value"
}
191
OldCurmudgeon

Ich denke, OldCurmudgeon und StaxMan sind beide richtig, aber hier ist eine Satzantwort mit einem einfachen Beispiel für Sie.

@JsonProperty (Name) weist Jackson ObjectMapper an, den Namen der JSON-Eigenschaft dem Namen des mit Anmerkungen versehenen Java Felds zuzuordnen.

//example of json that is submitted 
"Car":{
  "Type":"Ferrari",
}

//where it gets mapped 
public static class Car {
  @JsonProperty("Type")
  public String type;
 }
34
grepit

nun, was es jetzt wert ist ... JsonProperty wird AUCH verwendet, um Get- und Setter-Methoden für die Variable festzulegen, abgesehen von der üblichen Serialisierung und Deserialisierung. Angenommen, Sie haben eine Nutzlast wie die folgende:

{
  "check": true
}

und eine Deserializer-Klasse:

public class Check {

  @JsonProperty("check")    // It is needed else Jackson will look got getCheck method and will fail
  private Boolean check;

  public Boolean isCheck() {
     return check;
  }
}

In diesem Fall ist eine JsonProperty-Annotation erforderlich. Allerdings, wenn Sie auch eine Methode in der Klasse haben

public class Check {

  //@JsonProperty("check")    Not needed anymore
  private Boolean check;

  public Boolean getCheck() {
     return check;
  }
}

Schauen Sie sich auch diese Dokumentation an: http://fasterxml.github.io/jackson-annotations/javadoc/2.3.0/com/fasterxml/jackson/annotation/JsonProperty.html

31
Richeek

Ohne Anmerkungen wäre der abgeleitete Eigenschaftsname (der mit JSON übereinstimmt) "gesetzt" und nicht - wie beabsichtigt - "isSet". Dies liegt daran, dass laut Java Beans-Spezifikation die Methoden der Form "isXxx" und "setXxx" bedeuten, dass die logische Eigenschaft "xxx" verwaltet werden muss.

12
StaxMan

Wie Sie wissen, dreht sich hier alles um das Serialisieren und Entsalzen eines Objekts. Angenommen, es gibt ein Objekt:

public class Parameter {
  public String _name;
  public String _value; 
}

Die Serialisierung dieses Objekts ist:

{
  "_name": "...",
  "_value": "..."
}

Der Variablenname wird direkt zum Serialisieren von Daten verwendet. Wenn Sie die System-API aus der Systemimplementierung entfernen möchten, müssen Sie in einigen Fällen die Variable in Serialisierung/Deserialisierung umbenennen. @JsonProperty sind Metadaten, die dem Serializer mitteilen, wie ein serielles Objekt erstellt werden soll. Es wird verwendet, um:

  • variablennamen
  • zugriff (LESEN, SCHREIBEN)
  • standardwert
  • erforderlich/optional

vom Beispiel:

public class Parameter {
  @JsonProperty(
        value="Name",
        required=true,
        defaultValue="No name",
        access= Access.READ_WRITE)
  public String _name;
  @JsonProperty(
        value="Value",
        required=true,
        defaultValue="Empty",
        access= Access.READ_WRITE)
  public String _value; 
}
3
Mostafa

Das Hinzufügen der JsonProperty stellt auch die Sicherheit für den Fall sicher, dass jemand entscheidet, einen der Eigenschaftsnamen zu ändern, der nicht erkennt, dass die betreffende Klasse in ein Json-Objekt serialisiert wird. Wenn sie den Eigenschaftsnamen ändern, stellt JsonProperty sicher, dass er im Json-Objekt und nicht im Eigenschaftsnamen verwendet wird.

3
arush436

Neben anderen Antworten ist die Annotation @JsonProperty Wirklich wichtig, wenn Sie die Annotation @JsonCreator In Klassen verwenden, die keinen Konstruktor ohne Argumente haben.

public class ClassToSerialize {

    public enum MyEnum {
        FIRST,SECOND,THIRD
    }

    public String stringValue = "ABCD";
    public MyEnum myEnum;


    @JsonCreator
    public ClassToSerialize(MyEnum myEnum) {
        this.myEnum = myEnum;
    }

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();

        ClassToSerialize classToSerialize = new ClassToSerialize(MyEnum.FIRST);
        String jsonString = mapper.writeValueAsString(classToSerialize);
        System.out.println(jsonString);
        ClassToSerialize deserialized = mapper.readValue(jsonString, ClassToSerialize.class);
        System.out.println("StringValue: " + deserialized.stringValue);
        System.out.println("MyEnum: " + deserialized.myEnum);
    }
}

In diesem Beispiel ist der einzige Konstruktor als @JsonCreator Markiert, daher verwendet Jackson diesen Konstruktor, um die Instanz zu erstellen. Aber die Ausgabe ist wie folgt:

Serialisiert: {"stringValue": "ABCD", "myEnum": "FIRST"}

Ausnahme im Thread "main" com.fasterxml.jackson.databind.exc.InvalidFormatException: Instanz von ClassToSerialize $ MyEnum kann nicht aus dem Zeichenfolgenwert 'stringValue' erstellt werden: Wert nicht einer der angegebenen Enum-Instanznamen : [ERSTER, ZWEITER, DRITTER]

Aber nach dem Hinzufügen der Annotation @JsonProperty Im Konstruktor:

@JsonCreator
public ClassToSerialize(@JsonProperty("myEnum") MyEnum myEnum) {
    this.myEnum = myEnum;
}

Die Deserialisierung ist erfolgreich:

Serialisiert: {"myEnum": "FIRST", "stringValue": "ABCD"}

StringValue: ABCD

MyEnum: ZUERST

3
DVarga

Vergessen Sie neben den oben genannten Antworten nicht den Teil der Dokumentation, in dem es heißt

Markierungsannotation, mit der eine nicht statische Methode als "Setter" oder "Getter" für eine logische Eigenschaft (abhängig von ihrer Signatur) oder ein nicht statisches Objektfeld definiert werden kann, das als logisches Feld verwendet werden soll (serialisiert, deserialisiert) Eigentum.

Wenn Sie in Ihrer Klasse eine non-static - Methode haben, die keine konventionelle getter or setter - Methode ist, können Sie sie wie eine getter and setter - Methode verhalten, indem Sie die Annotation verwenden. Siehe das folgende Beispiel

public class Testing {
    private Integer id;
    private String username;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getIdAndUsername() {
        return id + "." + username; 
    }

    public String concatenateIdAndUsername() {
        return id + "." + username; 
    }
}

Wenn das obige Objekt serialisiert ist, enthält die Antwort

  • benutzername von getUsername()
  • id von getId()
  • idAndUsername von getIdAndUsername *

Da die Methode getIdAndUsername mit get beginnt, wird sie als normaler Getter behandelt, weshalb Sie dies mit @JsonIgnore Kommentieren können.

Wenn Sie bemerkt haben, dass das concatenateIdAndUsername nicht zurückgegeben wird und der Name nicht mit get beginnt und Sie möchten, dass das Ergebnis dieser Methode in die Antwort aufgenommen wird, können Sie @JsonProperty("...") und es würde als normales getter/setter behandelt, wie in der oben hervorgehobenen Dokumentation erwähnt.

0
Raf

Aus JsonProperty javadoc,

Definiert den Namen der logischen Eigenschaft, d. H. Den Namen des JSON-Objektfelds, das für die Eigenschaft verwendet werden soll. Wenn value leer ist (dies ist die Standardeinstellung), wird versucht, den Namen des mit Anmerkungen versehenen Felds zu verwenden.

0
sc30