Czy jest możliwe: mieć jedno pole w klasie, ale różne nazwy dla niego podczas serializacji / deserializacji w bibliotece Jacksona?
Na przykład mam klasę „Coordiantes”.
class Coordinates{
int red;
}
W przypadku deserializacji z JSON chcesz mieć taki format:
{
"red":12
}
Ale kiedy zserializuję obiekt, wynik powinien być taki:
{
"r":12
}
Próbowałem to zaimplementować, stosując @JsonProperty
adnotacje zarówno na getter, jak i setter (z różnymi wartościami):
class Coordiantes{
int red;
@JsonProperty("r")
public byte getRed() {
return red;
}
@JsonProperty("red")
public void setRed(byte red) {
this.red = red;
}
}
ale mam wyjątek:
org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Nierozpoznane pole „czerwone”
Możesz użyć tego,
@jsonAlias
który został wprowadzony w Jackson 2.9.0Przykład:
Używa
r
podczas serializacji, ale zezwalared
na alias podczas deserializacji. To jednak nadal pozwalar
na deserializację.źródło
has no effect during serialization where primary name is always used
. Nie tego chce PO.r
jako nazwy podstawowej, alered
dla@JsonAlias
, która pozwala na serializacjęr
, ale dodaje,red
aby być rozpoznawanym podczas deserializacji.@JsonProperty("r")
Dodanie do niego adnotacji i dodatkowo@JsonAlias("red")
powinno działać dobrze w przypadku danego problemu.Możesz użyć kombinacji @JsonSetter i @JsonGetter, aby odpowiednio kontrolować deserializację i serializację właściwości. Umożliwi to również zachowanie standardowych nazw metod pobierających i ustawiających, które odpowiadają rzeczywistej nazwie pola.
źródło
Powiązałbym dwie różne pary pobierające / ustawiające do jednej zmiennej:
źródło
@JsonGetter
i@JsonSetter
. Można więc dokładnie ustawić, jak będzie się zachowywał serializator.Możliwe jest posiadanie normalnej pary getter / setter. Musisz tylko określić tryb dostępu w
@JsonProperty
Oto test jednostkowy:
Otrzymałem wynik w następujący sposób:
źródło
Nie tego oczekiwałem jako rozwiązania (chociaż jest to uzasadniony przypadek użycia). Moim wymaganiem było zezwolenie istniejącemu błędnemu klientowi (już wydanej aplikacji mobilnej) na używanie alternatywnych nazw.
Rozwiązaniem jest zapewnienie oddzielnej metody ustawiającej, takiej jak ta:
źródło
Wiem, że to stare pytanie, ale dla mnie działało, gdy zorientowałem się, że jest to sprzeczne z biblioteką Gson, więc jeśli używasz Gson, użyj
@SerializedName("name")
zamiast@JsonProperty("name")
mieć nadzieję, że to pomagaźródło
Adnotacje,
@JsonAlias
które zostały wprowadzone w Jackson 2.9+, bez wspominania@JsonProperty
o elemencie do deserializacji z więcej niż jednym aliasem (różne nazwy dla właściwości JSON) działają dobrze.Użyłem
com.fasterxml.jackson.annotation.JsonAlias
do spójności pakietu zcom.fasterxml.jackson.databind.ObjectMapper
dla mojego przypadku użycia.Na przykład:
po prostu działa dobrze.
źródło
Musieli uwzględnić to jako funkcję, ponieważ teraz ustawienie innego
@JsonProperty
dla metody pobierającej i ustawiającej daje dokładnie to, czego można oczekiwać (inna nazwa właściwości podczas serializacji i deserializacji dla tego samego pola). Jackson w wersji 2.6.7źródło
Możesz napisać klasę serializacji, aby to zrobić:
źródło