REST API + Jackson (ukrywanie pól w odpowiedzi)

0

Cześć,

Mam sobie klase Customer, która ma pola:

String id;
String name;
String lastName;
String address;
String thirdName;
String fourthName;

Mam sobie API, które zwraca tego Customer'a po id i zwraca coś takieg:

{
"id": "1",
"name": "Marek",
"lastName": "Jakistam",
"address": "Warszawa",
"thirdName": "",
"fourthName": ""
}

W jaki sposób mogę ukryć pola, które zwracają " " lub null? Druga sprawa w jaki sposób mogę ukryć jakieś pole niezależnie od wartości w odpowiedzi API ale dalej korzystać z getterów i setterów? Używam jak w tytule Jackson'a.

Z góry dzięki za odpowiedzi

2

W klasie Customer Dodaj adnotację

@JsonInclude(Include.NON_NULL)

To spowoduje, ze wszystkie pola, które mają wartość null nie będą wyśweitlane

0
Black007 napisał(a):

W klasie Customer Dodaj adnotację

@JsonInclude(Include.NON_NULL)

To spowoduje, ze wszystkie pola, które mają wartość null nie będą wyśweitlane

Ok, to null z głowy, a co z resztą? Wiesz może?

0

W takim razie użyj NON_EMPTY zamiast NON_NULL
Od wersji 2.7 ukrywa pola z wartościami: "null, absent, empty String, empty containers". Jeśli używasz innych wersji to sprawdź sobie dokumentację,bo tam było jeszcze ukrywanie dat, defaultowych wartości ustawionych w POJO, itp.

Co do ukrywania pól w odpowiedzi to tu masz odpowiedź:
https://stackoverflow.com/a/12505165

2

Jeśli chcesz wyłączyć jakieś pole z serializacji to użyj po prostu @JsonIgnore

0

Cześć, mam podobny problem więc się podepnę do wątku, z tymże w moim wypadku potrzebuję mieć możliwość ukrywania pól dynamicznie, tzn użytkownik podaje jakie chce pobrać pola, i te pola potrzebuje mu zwrócić, a jeśli nie poda to wszystkie możliwe. Zrobienie tego za pomocą ukrywania nulli jest słabym pomysłem, bo ukryje mi pola w których będą nulle a użytkownik chciał je pobrać. JsonView/JsonIgnore też użyć nie mogę, bo te pola do ukrycia będą się zmieniać. Ktoś ma jakąś wskazówkę jak rozwiązać ten problem.

0

Trochę mało informacji ale może w taki sposób:
Zakładam, że pobieranie jest coś z bazy, więc jak user w requescie poda pola które chce dostać to generujesz takiego sql:

Select {wybrane pola} from ...

Wtedy pobrany obiekt ma ustawione tylko wybrane pola (więc nawet jak masz mapowanie na jakieś dto to też będą mapowane tylko te pola) reszta jest null więc używasz

@JsonInclude(Include.NON_NULL)

Masz obiekt z polami które podał user.

1

Skoro użytkownik ma możliwość podać listę pól do wyboru (btw, trochę spore ryzyko SQL injection, ostrożnie), i wynik zwracany po reście ma być dynamiczny, to może zamiast kombinować z ukrywaniem pól na silnie typowanej klasie itd. może zbuduj ręcznie Map<String, Object> i wypluj go z kontrolera - nie wiem czy o to chodzi, ale może pomogę :)

0

Rozwiązań jest wiele, ale żeby coś konkretniej powiedzieć to napisz czego używasz to persystencji

0

A ja mam pytanko. Czy ktoś robił kiedyś ręcznie mappery obiektów na jsona i po prostu kodem mógł osiągnąć ten efekt? Ifami?

0

Dzięki za odp,
Użycie

@JsonInclude(Include.NON_NULL)

Jest w moim przypadku złe, bo ukryje mi pola również te których nie powinien, mogę miec nulle w bazie i już takiego wyniku nie zwrócę w jsonie.
Zastanawiałem się właśnie nad stworzeniem Mapy i uzupełnianiem jej o konkretne wartości-obiekty, ale wydawało mi się to prymitywnym rozwiązaniem i trudnym na dalsze utrzymanie.
Używam Hibernate i springa i za pomocą springowego BeanUtils mapuje necje na DTO, ale będę musiał zmienić, bo wynikowy json nie odzwierciedla dokładnie obiektów, więc będę musiał mapować ręcznie (chyba że ktoś ma inny pomysł). Znalazłem taką bibliotekę com.monitorjbl » json-view która nawet fajnie działa i robi to co potrzebuję. Ktoś z niej może korzystał i coś więcej może powiedzieć, lub polecić coś innego, sprawdzonego?

0

Nie wydaję mi się, żeby używanie adnotacji JsonView było w moim przypadku dobrym rozwiązaniem. Dzięki za MapStruct, wydaję się fajnym narzędziem. Klas mam dosłownie kilka

0

Jak już będziesz mieć przemapowaną klasę, to używając tego https://github.com/monitorjbl/json-view możesz łatwo określić, które pola mają być serializowane w dynamiczny sposób, np. jakiegoś parametru w requeście.

0

Właśnie użyłem tej biblioteki i serializuje mi tak jak chcę (tylko, że do Stringa), lecz pojawił mi się problem, że w odpowiedzi nie dostaję czystego JSONA

"imie": {
      "title": "Imię",
      "type": "simple",     
    },

a dostaję dziwną sklejkę typu ResponseEntity.ok().body(data); - jak przekazywałem zmapowany obiekt DTO, otrzymywałem poprawny JSON

\"imie\": {\"title\": \"Imię\",\"type\": \"simple\",\"data-type\": \"string\"},

1 użytkowników online, w tym zalogowanych: 0, gości: 1