我有一个界面,我想用它来序列化/反序列化。我想省略一些字段。到目前为止,以下代码无效。
@JsonAutoDetect(fieldVisibility = Visibility.NONE)
public interface MyWrapper {
//no annotation to not serialize
String getMyField();
//annotation to deserialize
@JsonProperty("my_field")
void setMyField();
}
答案 0 :(得分:0)
您可以在方法上指定@JsonIgnore
注释,也可以在类上指定@JsonIgnoreProperties(value = {"myfield"})
注释。
编辑:
您使用的是哪个版本的杰克逊?因为我正在使用的那个(2.5)@JsonIgnore
和@JsonProperty
的使用完美无缺。
另外,请注意,设置者需要接收杰克逊实际使用的参数
与固定设置器的接口:
@JsonAutoDetect(fieldVisibility = Visibility.NONE)
public interface MyWrapper {
@JsonIgnore
String getMyField();
// annotation to deserialize
@JsonProperty("my_field")
void setMyField(String f);
}
实施(这里没有什么令人兴奋的)
public class Foo implements MyWrapper {
private String myField;
public Foo() {}
public Foo(String f) {
setMyField(f);
}
@Override
public String getMyField() {
return myField;
}
@Override
public void setMyField(String f) {
myField = f;
}
}
测试:
public static void main(String[] args) {
ObjectMapper mapper = new ObjectMapper();
// serialization - ignore field
try {
MyWrapper w = new Foo("value");
String json = mapper.writeValueAsString(w);
System.out.println("serialized MyWrapper: " + json);
} catch (Exception e) {
e.printStackTrace();
}
// de-serialization - read field
String json = "{\"my_field\":\"value\"}";
try (InputStream is = new ByteArrayInputStream(json.getBytes("UTF-8"))) {
MyWrapper w = (MyWrapper)mapper.readValue(is, Foo.class);
System.out.println("deserialized MyWrapper: input: " + json + " ; w.getMyField(): " + w.getMyField());
} catch (Exception e) {
e.printStackTrace();
}
}
输出:
serialized MyWrapper: {}
deserialized MyWrapper: input: {"my_field":"value"} ; w.getMyField(): value