Obecnie używam jackson 2.1.4 i mam problemy z ignorowaniem pól podczas konwertowania obiektu na ciąg JSON.
Oto moja klasa, która działa jako obiekt do konwersji:
public class JsonOperation {
public static class Request {
@JsonInclude(Include.NON_EMPTY)
String requestType;
Data data = new Data();
public static class Data {
@JsonInclude(Include.NON_EMPTY)
String username;
String email;
String password;
String birthday;
String coinsPackage;
String coins;
String transactionId;
boolean isLoggedIn;
}
}
public static class Response {
@JsonInclude(Include.NON_EMPTY)
String requestType = null;
Data data = new Data();
public static class Data {
@JsonInclude(Include.NON_EMPTY)
enum ErrorCode { ERROR_INVALID_LOGIN, ERROR_USERNAME_ALREADY_TAKEN, ERROR_EMAIL_ALREADY_TAKEN };
enum Status { ok, error };
Status status;
ErrorCode errorCode;
String expiry;
int coins;
String email;
String birthday;
String pictureUrl;
ArrayList <Performer> performer;
}
}
}
A oto jak to konwertuję:
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
JsonOperation subscribe = new JsonOperation();
subscribe.request.requestType = "login";
subscribe.request.data.username = "Vincent";
subscribe.request.data.password = "test";
Writer strWriter = new StringWriter();
try {
mapper.writeValue(strWriter, subscribe.request);
} catch (JsonGenerationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JsonMappingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.d("JSON", strWriter.toString())
Oto wynik:
{"data":{"birthday":null,"coins":null,"coinsPackage":null,"email":null,"username":"Vincent","password":"test","transactionId":null,"isLoggedIn":false},"requestType":"login"}
Jak mogę uniknąć tych wartości null? Chcę tylko pobrać wymagane informacje w celu „subskrypcji”!
Oto dokładnie wynik, którego szukam:
{"data":{"username":"Vincent","password":"test"},"requestType":"login"}
Próbowałem też @JsonInclude (Include.NON_NULL) i ustawiłem wszystkie moje zmienne na null, ale to też nie działało! Dzięki za pomoc!
Odpowiedzi:
Masz adnotację w niewłaściwym miejscu - musi znajdować się na zajęciach, a nie w polu. to znaczy:
Jak zauważono w komentarzach, w wersjach poniżej 2.x składnia tej adnotacji jest następująca:
Inną opcją jest
ObjectMapper
bezpośrednia konfiguracja , po prostu dzwoniącmapper.setSerializationInclusion(Include.NON_NULL);
(dla porządku, myślę, że popularność tej odpowiedzi wskazuje, że ta adnotacja powinna mieć zastosowanie w poszczególnych polach, @fasterxml)
źródło
@JsonInclude(JsonSerialize.Inclusion.NON_NULL)
powinno być,@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
a także jest to stary przestarzały sposób. więc powinieneś napisać „w wersji poniżej 2.x”, a nie „w wersji 2.x +”@JsonInclude(Include.NON_NULL)
Możesz także ustawić opcję globalną:
źródło
Możesz także spróbować użyć
jeśli masz do czynienia z jacksonem z wersją poniżej 2+ (1.9.5) to testowałem to bez problemu możesz użyć tej adnotacji nad klasą. Nie dla określonych dla atrybutów, tylko dla dekleracji klas.
źródło
Musisz dodać
import com.fasterxml.jackson.annotation.JsonInclude;
Dodaj
na szczycie POJO
Jeśli masz zagnieżdżone POJO, to
trzeba dodać wszystkie wartości.
UWAGA: JAXRS (Jersey) automatycznie obsługuje ten scenariusz 2.6 i nowsze.
źródło
Dla jackson 2.x
tuż przed polem.
źródło
Ostatnio miałem podobny problem z wersją 2.6.6.
Używanie powyższej adnotacji na poziomie pola lub klasy nie działało zgodnie z oczekiwaniami. POJO było zmienne, gdy stosowałem adnotację. Kiedy zmieniłem zachowanie POJO na niezmienne, adnotacja zadziałała magicznie.
Nie jestem pewien, czy jego nowa wersja lub poprzednie wersje tej biblioteki zachowywały się podobnie, ale dla 2.6.6 z pewnością musisz mieć Immutable POJO, aby adnotacja działała.
Powyższa opcja wymieniona w różnych odpowiedziach dotyczących ustawiania włączenia serializacji w ObjectMapper bezpośrednio na poziomie globalnym również działa, ale wolę kontrolować ją na poziomie klasy lub pola.
Więc jeśli chcesz, aby wszystkie pola puste były ignorowane podczas serializacji JSON, użyj adnotacji na poziomie klasy, ale jeśli chcesz, aby tylko kilka pól w klasie było ignorowanych, użyj ich na tych określonych polach. W ten sposób jest bardziej czytelny i łatwy w utrzymaniu, jeśli chcesz zmienić zachowanie dla określonej odpowiedzi.
źródło
Możesz też użyć GSON [ https://code.google.com/p/google-gson/ ], gdzie te puste pola zostaną automatycznie usunięte.
SampleDTO.java
Test.java
WYNIK:
Użyłem gson-2.2.4
źródło
Poniższy kod może pomóc, jeśli chcesz wykluczyć typ boolowski z serializacji:
źródło