Ten stan „fasoli” fasoli:
public class State {
private boolean isSet;
@JsonProperty("isSet")
public boolean isSet() {
return isSet;
}
@JsonProperty("isSet")
public void setSet(boolean isSet) {
this.isSet = isSet;
}
}
jest wysyłany przewodowo za pomocą wywołania zwrotnego „sukces” ajax:
success : function(response) {
if(response.State.isSet){
alert('success called successfully)
}
Czy wymagana jest tutaj adnotacja @JsonProperty? Jaka jest zaleta korzystania z niego? Myślę, że mogę usunąć tę adnotację bez powodowania żadnych skutków ubocznych.
Czytając o tej adnotacji na https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations Nie wiem, kiedy należy z niej skorzystać?
Odpowiedzi:
Oto dobry przykład. Używam go do zmiany nazwy zmiennej, ponieważ JSON pochodzi ze
.Net
środowiska, w którym właściwości zaczynają się od dużej litery.To poprawnie analizuje do / z JSON:
źródło
@JsonProperty
adnotacji.Double
? Zastanawiam się tylko, czy musi to byćString
typ, czy jakikolwiek typ obsługiwany przez JSON? Czy może to być dowolny typ? @OldCurmudgeonMyślę, że OldCurmudgeon i StaxMan są poprawne, ale oto odpowiedź na jedno zdanie z prostym przykładem dla ciebie.
@JsonProperty (nazwa), mówi Jackson ObjectMapper, aby odwzorował nazwę właściwości JSON na nazwę pola Java z adnotacją.
źródło
cóż za to, co jest teraz warte ... JsonProperty jest również używany do określania metod pobierających i ustawiających dla zmiennej oprócz zwykłej serializacji i deserializacji. Załóżmy na przykład, że masz taki ładunek:
i klasa Deserializer:
Następnie w tym przypadku należy wykonać adnotację JsonProperty. Jeśli jednak masz również metodę w klasie
Zajrzyj również do tej dokumentacji: http://fasterxml.github.io/jackson-annotations/javadoc/2.3.0/com/fasterxml/jackson/annotation/JsonProperty.html
źródło
Bez adnotacji wywnioskowana nazwa właściwości (pasująca do JSON) byłaby „ustawiona”, a nie - jak się wydaje intencją - „isSet”. Wynika to z faktu, że zgodnie ze specyfikacją Java Beans metody w postaci „isXxx” i „setXxx” oznaczają, że istnieje właściwość logiczna „xxx” do zarządzania.
źródło
Jak wiecie, chodzi o serializację i odsalanie obiektu. Załóżmy, że istnieje obiekt:
Serializacja tego obiektu to:
Nazwa zmiennej służy bezpośrednio do serializacji danych. Jeśli masz zamiar usunąć systemowy interfejs API z implementacji systemu, w niektórych przypadkach musisz zmienić nazwę zmiennej podczas serializacji / deserializacji. @JsonProperty to metadane informujące serializator o sposobie szeregowania obiektów. Służy do:
z przykładu:
źródło
Dodanie JsonProperty zapewnia również bezpieczeństwo na wypadek, gdyby ktoś zdecydował, że chce zmienić jedną z nazw właściwości, które nie zdają sobie sprawy, że dana klasa zostanie serializowana do obiektu Json. Jeśli zmienią nazwę właściwości, JsonProperty zapewnia, że zostanie ona użyta w obiekcie Json, a nie nazwa właściwości.
źródło
Oprócz innych odpowiedzi
@JsonProperty
adnotacja jest naprawdę ważna, jeśli używasz@JsonCreator
adnotacji w klasach, które nie mają konstruktora bez arg.W tym przykładzie jedyny konstruktor jest oznaczony jako
@JsonCreator
, dlatego Jackson użyje tego konstruktora do utworzenia instancji. Ale wynik jest jak:Ale po dodaniu
@JsonProperty
adnotacji do konstruktora:Deserializacja powiodła się:
źródło
Oprócz wszystkich powyższych odpowiedzi nie zapomnij o części dokumentacji, która mówi
Jeśli masz
non-static
w swojej klasie metodę, która nie jest konwencjonalnagetter or setter
, możesz sprawić, by działała jakgetter and setter
za pomocą adnotacji na niej. Zobacz przykład poniżejKiedy powyższy obiekt jest szeregowany, odpowiedź będzie zawierać
getUsername()
getId()
getIdAndUsername
*Ponieważ metoda
getIdAndUsername
zaczyna się odget
tego momentu, jest traktowana jako normalny getter, dlatego też można przypisać takie adnotacje@JsonIgnore
.Jeśli zauważyłeś, że
concatenateIdAndUsername
nie jest zwracany, a to dlatego, że jego nazwa nie zaczyna się od,get
a jeśli chcesz, aby wynik tej metody został uwzględniony w odpowiedzi, możesz go użyć@JsonProperty("...")
i będzie traktowany jak normalnie,getter/setter
jak wspomniano w powyższej wyróżnionej dokumentacji .źródło
Z JsonProperty javadoc,
źródło