2012-09-25 13 views
96

Diese Bean 'Staat':Wann wird die @ JsonProperty-Eigenschaft verwendet und wofür wird sie verwendet?

public class State { 

    private boolean isSet; 

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

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

} 

über den Draht geschickt, um den 'Erfolg' Ajax Rückruf:

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

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

Lesen über diese Annotion auf https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations Ich weiß nicht, wann dies benötigt wird, um verwendet zu werden?

+0

wiki.fasterxml.com link ist gebrochen – JohnK

Antwort

126

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

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

Diese parst richtig zum/vom JSON:

"Parameter":{ 
    "Name":"Parameter-Name", 
    "Value":"Parameter-Value" 
} 
+0

Können die String-Member-Variablen nicht in ihren korrekten Fall umbenannt werden, so öffentliche String-Name; wird öffentlicher String Name; ? –

+7

Ja, das können sie, aber in einer Java-Umgebung, die sie nicht mit den Kodierungsstandards übereinstimmt. Es geht mehr um meine Pedanterie als ein echtes Coding-Problem, aber es ist ein gutes, aber einfaches Beispiel für eine echte Verwendung der '@ JsonProperty' Annotation. – OldCurmudgeon

+0

Kann diese Anmerkung für das Element vom Typ "Double" verwendet werden? Ich frage mich nur, ob der Typ "String" oder irgendein Typ sein muss, den JSON unterstützt? Könnte es irgendeine Art sein? @OldCurmudgeon – Dreamer

9

Ohne Anmerkungen abgeleitete Eigenschaftsnamen (von der JSON entsprechen) würde „gesetzt“ werden, und nicht - wie scheint der zu sein, Absicht - "isSet". Dies liegt daran, dass gemäß der Java Beans-Spezifikation die Methoden der Form "isXxx" und "setXxx" so verstanden werden, dass die logische Eigenschaft "xxx" zu verwalten ist.

24

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

@JsonProperty (Name), teilt Jackson ObjectMapper mit, den JSON-Eigenschaftsnamen dem Namen des annotierten 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; 
} 
+0

Der Klassenname sollte dem Stammelement von JSON entsprechen. Das funktioniert nicht für mich. – Pavan

20

gut für das, was jetzt sein Wert ... ist JsonProperty auch für die Variable abgesehen von üblichen Serialisierung und Deserialisierung zu spezifizieren Getter und Setter-Methoden verwendet. Zum Beispiel: Angenommen, Sie eine Nutzlast wie diese:

{ 
    "check": true 
} 

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

dann in diesem Fall JsonProperty Anmerkung neeeded wird. Allerdings, wenn Sie auch eine Methode in der Klasse

public class Check { 

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

    public Boolean getCheck() { 
    return check; 
    } 
} 

Werfen Sie einen Blick auf diese Dokumentation haben auch: http://fasterxml.github.io/jackson-annotations/javadoc/2.3.0/com/fasterxml/jackson/annotation/JsonProperty.html

3

Wie Sie wissen, das alles serialize ist und ein Objekt desalinize. Angenommen, es ist ein Ziel:

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

Die Serialisierung dieses Objekts ist:

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

Der Name der Variablen wird direkt verwendet, um Daten zu serialisieren. Wenn Sie System-API aus der Systemimplementierung entfernen möchten, müssen Sie in einigen Fällen die Variable in Serialisierung/Deserialisierung umbenennen. @JsonProperty ist ein Metadaten, um dem Serializer mitzuteilen, wie ein serielles Objekt aussehen soll.Es wird verwendet, um:

  • Variablenname
  • Zugriff (Lesen, Schreiben)
  • Standardwert
  • erforderlich/optional

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

Aus JsonProperty javadoc,

Definiert den Namen der logischen Eigenschaft, d. H. Den JSON-Objektfeldnamen, der für die Eigenschaft verwendet werden soll. Wenn der Wert leer ist Zeichenfolge (dies ist der Standardwert), wird versucht, den Namen des annotierten Felds zu verwenden.

0

Als Ergänzung zu anderen Antworten ist @JsonProperty Anmerkung wirklich wichtig, wenn Sie die @JsonCreator Anmerkung in Klassen verwenden, das nicht über einen nicht-arg-Konstruktor.

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 ist, wird daher Jackson diesen Konstruktor verwenden, um die Instanz zu erstellen. Aber der Ausgang ist wie:

Serialized: { "Stringvalue": "ABCD", "MyEnum": "FIRST"}

Exception in thread "main" com.fasterxml.jackson.databind .exc.InvalidFormatException: Kann nicht konstruieren Instanz com.avl.mbdtool.verificationmodule.exceptiondocument.ClassToSerialize $ MyEnum von String-Wert 'String': Wert nicht einer der deklarierten Enum Instanznamen: [FIRST, SECOND, THIRD ]

Aber nach der Zugabe der @JsonProperty Anmerkung im Konstruktor:

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

Die Deserialisierung ist erfolgreich:

Serialized: { "MyEnum": "FIRST", "String":“ ABCD "}

String: ABCD

MyEnum: FIRST