Se non è possibile modificare le classi, è possibile creare una nuova classe/interfaccia astratta che contenga metodi con annotazione @JsonIgnore
. In questa classe/interfaccia è possibile definire i metodi che devono essere saltati durante il processo di serializzazione/deserializzazione nel modo ObjectMapper
.
prega, vedere il mio piccolo esempio:
import java.io.IOException;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonProgram {
public static void main(String[] args) throws IOException {
Person person = new Person();
person.setId(1L);
person.setName("Max");
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.addMixInAnnotations(Person.class, PersonMixIn.class);
System.out.println(objectMapper.writeValueAsString(person));
}
}
abstract class Entity {
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
interface Namamble {
String getName();
}
class Person extends Entity implements Namamble {
private String name;
@Override
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
interface PersonMixIn {
@JsonIgnore
String getName();
}
EDIT - risposta per i commenti
È possibile creare tale interfaccia mixin:
public static interface UserInformationMixIn {
@JsonIgnore
String getField3();
}
e configurare ObjectMapper
in questo modo :
objectMapper.addMixInAnnotations(UserInformation.class, UserInformationMixIn.class);
codice completo sorgente di esempio:
import java.io.IOException;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonProgram {
public static void main(String[] args) throws IOException {
UserInformation userInformation = new UserInformation();
userInformation.setField3("field3");
userInformation.setField4("field4");
userInformation.setField5("field5");
User user = new User();
user.setField1(userInformation);
user.setField2("field2");
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.addMixInAnnotations(UserInformation.class, UserInformationMixIn.class);
objectMapper.addMixInAnnotations(User.class, UserInformationMixIn.class);
System.out.println(objectMapper.writeValueAsString(user));
}
public static abstract class Someclass {
String field5;
public String getField5() {
return field5;
}
public void setField5(String field5) {
this.field5 = field5;
}
}
public static class UserInformation extends Someclass {
String field3;
String field4;
public String getField3() {
return field3;
}
public void setField3(String field3) {
this.field3 = field3;
}
public String getField4() {
return field4;
}
public void setField4(String field4) {
this.field4 = field4;
}
}
public static class User {
UserInformation field1;
String field2;
public UserInformation getField1() {
return field1;
}
public void setField1(UserInformation field1) {
this.field1 = field1;
}
public String getField2() {
return field2;
}
public void setField2(String field2) {
this.field2 = field2;
}
}
public static interface UserInformationMixIn {
@JsonIgnore
String getField3();
@JsonIgnore
String getField2();
@JsonIgnore
String getField5();
}
}
Link utili:
fonte
2013-06-05 14:02:57
Se è possibile modificare la classe principale o l'interfaccia, poi basta usare la parola 'transient' nella tua dichiarazione sul campo. I campi transitori non saranno serializzati. Ad es: 'test transitorio pubblico int;' –
Grazie per la risposta, ma non riesco a toccare la classe principale. Altrimenti userei l'annotazione JSonIgnore sui campi specifici e tutto sarebbe risolto. – niceman
Questo è ciò che temo, quindi puoi provare a utilizzare la visualizzazione come in questo esempio: http://stackoverflow.com/a/8477588/1140748. –