简体   繁体   English

在写过程中如何告诉Jackson ObjectWriter忽略类成员

[英]How to tell to Jackson ObjectWriter ignore from class member during write

I'm using Java. 我正在使用Java。

I have the following class: 我有以下课程:

class MyClass{
    @JsonProperty("test")
    String test;

    String myPrivateTest;
}

I'm using Jackson ObjectWriter to write my JSON object to file/as string as follow: 我正在使用Jackson ObjectWriter将JSON对象写入文件/字符串,如下所示:

ObjectWriter writer = objMapper.writer(new DefaultPrettyPrinter());
writer.writeValue(new File(path), myObject);

I want to write to file only test member and not myPrivateTest, How can I do it? 我只想将test成员而不是myPrivateTest写入文件,该怎么办?

EDIT 编辑

I have been tried with: 我已经尝试过:

class MyClass{
        @JsonProperty("test")
        String test;

        @JsonIgnore
        String myPrivateTest;
    }

And with

@JsonIgnoreProperties({"myPrivateTest"})
class MyClass{
    @JsonProperty("test")
    String test;

    String myPrivateTest;
}

And It is still write myPrivateTest to the file 而且它仍然将myPrivateTest写入文件

You can ignore specific fields with providing PropertyFilter as below : 您可以通过提供PropertyFilter来忽略特定字段,如下所示:

@JsonFilter("someFilter")
@Data // lombok
@NoArgsConstructor // lombok
class SomeClass {
    private String name;
    private int someField;

    public SomeClass(String name, int sf){ 
        this.name=name;
        this.someField = sf;
    }
}

@Test
    public void test() throws JsonProcessingException {
        SomeClass someClass = new SomeClass("test",1);
        ObjectMapper mapper = new ObjectMapper();

        PropertyFilter theFilter = new SimpleBeanPropertyFilter() {
            @Override
            public void serializeAsField
                    (Object pojo, JsonGenerator jgen, SerializerProvider provider, PropertyWriter writer)
                    throws Exception {
                if (include(writer)) {
                    // here you can define the properties to ignore
                    if (!writer.getName().equals("name")) {
                        writer.serializeAsField(pojo, jgen, provider);
                        return;
                    }
                } else if (!jgen.canOmitFields()) {
                    writer.serializeAsOmittedField(pojo, jgen, provider);
                }
            }
        };

        FilterProvider filters = new SimpleFilterProvider()
                .addFilter("someFilter", theFilter);

        String objAsString = mapper
                .writer(filters)
                .writeValueAsString(someClass);

        assertThat(objAsString).doesNotContain("name");
    }

Serialized output is : 序列化输出为:

{"someField":1}

Using Jackson 2.9.6 使用杰克逊2.9.6

Just adding the @JsonProperty to the fields you want is enough. 只需将@JsonProperty添加到所需字段即可。

public class MyClass {

    @JsonProperty("test")
    String test;

    String myPrivateTest;

    public static void main(String[] args) throws IOException {

        ObjectMapper objectMapper = new ObjectMapper();
        MyClass c = new MyClass();
        c.test = "HELLO";
        c.myPrivateTest = "WORLD";
        System.out.println(objectMapper.writeValueAsString(c));
    }
}

Output: 输出:

{"test":"HELLO"}

String myPrivateTest is correctly ignored String myPrivateTest被正确忽略

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM