Ответ 1
Не нужно менять имя метода setter, чтобы избежать двусмысленности. В противном случае вы на правильном пути с @JsonIgnore
. При использовании @JsonIgnore
для всех тех же названных методов, которые нужно игнорировать, для использования не требуется аннотация @JsonProperty
.
Вот простой пример, чтобы продемонстрировать этот момент.
input.json: {"value":"forty-two"}
Foo.java:
import java.io.File;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.map.ObjectMapper;
public class Foo
{
String value;
public String getValue() {return value;}
public void setValue(String value) {this.value = value;}
@JsonIgnore
public void setValue(int value) {this.value = String.valueOf(value);}
public static void main(String[] args) throws Exception
{
ObjectMapper mapper = new ObjectMapper();
Foo foo = mapper.readValue(new File("input.json"), Foo.class);
System.out.println(mapper.writeValueAsString(foo));
}
}
Если вы не хотите изменять первоначальные POJO defs с помощью аннотации Jackson, вы можете использовать MixIn
.
import java.io.File;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.map.ObjectMapper;
public class Foo
{
String value;
public String getValue() {return value;}
public void setValue(String value) {this.value = value;}
public void setValue(int value) {this.value = String.valueOf(value);}
public static void main(String[] args) throws Exception
{
ObjectMapper mapper = new ObjectMapper();
mapper.getDeserializationConfig().addMixInAnnotations(Foo.class, IgnoreFooSetValueIntMixIn.class);
Foo foo = mapper.readValue(new File("input.json"), Foo.class);
System.out.println(mapper.writeValueAsString(foo));
}
}
abstract class IgnoreFooSetValueIntMixIn
{
@JsonIgnore public abstract void setValue(int value);
}