Jak zmienić nazwę pola w JSON za pomocą Jacksona

169

Używam Jacksona do konwersji mojego obiektu do JSON. Obiekt posiada 2 pola:

@Entity
public class City {
   @id
   Long id;
   String name;
   public String getName() { return name; }
   public void setName(String name){ this.name = name; }
   public Long getId() { return id; }
   public void setName(Long id){ this.id = id; }
}

Ponieważ chcę używać tego z funkcją automatycznego uzupełniania jQuery, chcę, aby „identyfikator” pojawiał się jako „wartość” w pliku json, a „nazwa” jako „etykieta”. Dokumentacja Jacksona nie jest w tym jasna i wypróbowałem każdą adnotację, która nawet zdalnie wydaje się, że robi to, czego potrzebuję, ale nie mogę namepojawić się jako labeli idpojawiać się tak, jak valuew json.

Czy ktoś wie, jak to zrobić, czy jest to możliwe?

Ali
źródło
Jeśli kiedykolwiek miałbyś potencjalnie wykorzystać jednostkę („Miasto”) do jakiegokolwiek innego celu lub logiki biznesowej, unikałbym definiowania jej reprezentacji JSON jako etykiety i wartości. OTOH, jeśli są to wyłącznie dane referencyjne używane do kombinacji, prawdopodobnie będziesz mieć więcej - stworzenie ogólnej jednostki (para lub opcja), aby pokryć wszystkie te elementy, jest możliwym podejściem do rozważenia.
Thomas W

Odpowiedzi:

323

Czy próbowałeś używać @JsonProperty?

@Entity
public class City {
   @id
   Long id;
   String name;

   @JsonProperty("label")
   public String getName() { return name; }

   public void setName(String name){ this.name = name; }

   @JsonProperty("value")
   public Long getId() { return id; }

   public void setId(Long id){ this.id = id; }
}
henrik_lundgren
źródło
5
Tak, próbowałem tego, jednak robiłem @JsonProperty(value="label")i nie działało, wypróbowałem to, jak sugerowałeś i działa! dzięki stary, to naprawdę pomoże teraz uprościć kod.
Ali
Mam podobne wymaganie. Tylko tyle, że używam Jacksona z RESTEasy i to nie działa: - / Dziwne!
Niks
sprawdź, czy Jackson naprawdę jest skonfigurowanym dostawcą, a nie czymś innym
henrik_lundgren
2
czy istnieje sposób wykorzystania Jacksona (lub GSON) do zmiany nazwy właściwości w już istniejącym ciągu JSON (nie podczas serializacji)?
Don Cheadle
Użyłem obiektu @JsonProperty ("object") val jsonObject: String, ... ale nie powiodło się
Raju yourPepe
45

Pamiętaj, że org.codehaus.jackson.annotate.JsonPropertyw Jackson 1.xi com.fasterxml.jackson.annotation.JsonPropertyw Jackson 2.x. Sprawdź, którego ObjectMappera używasz (z jakiej wersji) i upewnij się, że używasz właściwej adnotacji.

m3th0dman
źródło
Istnieje również org.json4s.jacksonprzestrzeń nazw. :) i ewentualnie inne implementacje jacksonYMMV.
Jesse Chisholm
14

Jest jeszcze jedna opcja zmiany nazwy pola:

Jackson MixIns .

Przydatne, jeśli masz do czynienia z klasami osób trzecich, do których nie możesz dodać adnotacji lub po prostu nie chcesz zanieczyszczać klasy adnotacjami specyficznymi dla Jacksona.

Dokumentacja Jacksona dotycząca Mixins jest nieaktualna, więc ten przykład może zapewnić większą przejrzystość. W skrócie: tworzysz klasę mixin, która wykonuje serializację tak, jak chcesz. Następnie zarejestruj go w ObjectMapper:

objectMapper.addMixIn(ThirdParty.class, MyMixIn.class);
Dimitar II
źródło
Jestem ciekawy, czy wpłynie to na wydajność podczas serializacji / deserializacji pól?
chanllen
2

Jackson

Jeśli używasz Jacksona, możesz użyć @JsonPropertyadnotacji, aby dostosować nazwę danej właściwości JSON.

W związku z tym wystarczy @JsonPropertydodać adnotacje do pól encji adnotacją i podać niestandardową nazwę właściwości JSON, na przykład:

@Entity
public class City {

   @Id
   @JsonProperty("value")
   private Long id;

   @JsonProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}

JavaEE lub JakartaEE JSON-B

JSON-B to standardowa warstwa powiązania do konwersji obiektów Java do iz formatu JSON. Jeśli używasz formatu JSON-B, możesz zastąpić nazwę właściwości JSON za pomocą @JsonbPropertyadnotacji:

@Entity
public class City {

   @Id
   @JsonbProperty("value")
   private Long id;

   @JsonbProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}
Vlad Mihalcea
źródło