W Jackson, kiedy dodajesz adnotację do konstruktora za pomocą @JsonCreator
, musisz dodać adnotację do jego argumentów za pomocą @JsonProperty
. Więc ten konstruktor
public Point(double x, double y) {
this.x = x;
this.y = y;
}
staje się tym:
@JsonCreator
public Point(@JsonProperty("x") double x, @JsonProperty("y") double y) {
this.x = x;
this.y = y;
}
Nie rozumiem, dlaczego jest to konieczne. Czy możesz wyjaśnić?
java
json
serialization
jackson
Ori Popowski
źródło
źródło
Nazwy parametrów zwykle nie są dostępne dla kodu Java w czasie wykonywania (ponieważ są upuszczane przez kompilator), więc jeśli chcesz mieć tę funkcję, musisz albo użyć wbudowanej funkcjonalności Java 8, albo użyć biblioteki, takiej jak ParaNamer, aby uzyskać dostęp do tego.
Aby więc nie używać adnotacji jako argumentów konstruktora podczas korzystania z Jacksona, możesz użyć jednego z tych 2 modułów Jacksona:
nazwy-parametrów-modułów-jackson
Ten moduł umożliwia uzyskanie argumentów konstruktora bez adnotacji podczas korzystania z języka Java 8 . Aby z niego skorzystać należy najpierw zarejestrować moduł:
Następnie skompiluj swój kod za pomocą flagi -parameters:
Link: https://github.com/FasterXML/jackson-modules-java8/tree/master/parameter-names
paranamer-module-jackson
Ten drugi wymaga po prostu zarejestrowania modułu lub skonfigurowania introspekcji adnotacji (ale nie obu, jak wskazują komentarze). Pozwala na użycie argumentów konstruktora bez adnotacji w wersjach Java wcześniejszych niż 1.8 .
Link: https://github.com/FasterXML/jackson-modules-base/tree/master/paranamer
źródło
Możliwe jest uniknięcie adnotacji konstruktora z jdk8, gdzie opcjonalnie kompilator wprowadzi metadane z nazwami parametrów konstruktora. Następnie z jackson-module-parameter-names moduł Jackson może użyć tego konstruktora. Możesz zobaczyć przykład pod postem Jackson bez adnotacji
źródło
Ponieważ kod bajtowy Java nie zachowuje nazw metod ani argumentów konstruktora.
źródło
@JsonProperty
adnotacjęMożna po prostu użyć adnotacji java.bean.ConstructorProperties - jest znacznie mniej szczegółowa i Jackson również ją akceptuje. Na przykład :
źródło
Kiedy dobrze to rozumiem , zastępujesz domyślny konstruktor sparametryzowanym i dlatego musisz opisać klucze JSON, które są używane do wywoływania konstruktora.
źródło
Jak wyjaśniono w dokumentacji adnotacji , adnotacja wskazuje, że nazwa argumentu jest używana jako nazwa właściwości bez żadnych modyfikacji, ale można określić niepustą wartość, aby określić inną nazwę:
źródło
Po prostu znajdź to i gdzieś otrzymałem odpowiedź. możesz użyć poniższej adnotacji od 2.7.0
źródło