将json字符串映射到具有匿名类的interace

时间:2015-12-14 21:57:34

标签: java json spring jackson mapping

我有一个界面,我想用它来序列化/反序列化。我想省略一些字段。到目前为止,以下代码无效。

@JsonAutoDetect(fieldVisibility = Visibility.NONE)
public interface MyWrapper {
    //no annotation to not serialize
    String getMyField();

    //annotation to deserialize
    @JsonProperty("my_field")
    void setMyField();
}

1 个答案:

答案 0 :(得分:0)

您可以在方法上指定@JsonIgnore注释,也可以在类上指定@JsonIgnoreProperties(value = {"myfield"})注释。

see examples here

编辑: 您使用的是哪个版本的杰克逊?因为我正在使用的那个(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