Search code examples
javajsonserializationjacksondatamapper

Jackson: how to serialize only annotated properties


I would like to define my custom serialization strategy (which fields to include), while using Jackson. I know, that I can do it with views/filters, but it introduces very bad thing - using string-representation of field names, which automatically enables problems with auto-refactoring.

How do I force Jackson into serializing only annotated properties and nothing more?


Solution

  • If you disable all auto-detection it should only serialize the properties that you have annotated--whether it be the properties themselves or the getters. Here's a simple example:

    private ObjectMapper om;
    
    @Before
    public void setUp() throws Exception {
        om = new ObjectMapper();
        // disable auto detection
        om.disable(MapperFeature.AUTO_DETECT_CREATORS,
                MapperFeature.AUTO_DETECT_FIELDS,
                MapperFeature.AUTO_DETECT_GETTERS,
                MapperFeature.AUTO_DETECT_IS_GETTERS);
        // if you want to prevent an exception when classes have no annotated properties
        om.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
    }
    
    @Test
    public void test() throws Exception {
        BlahClass blahClass = new BlahClass(5, "email", true);
        String s = om.writeValueAsString(blahClass);
        System.out.println(s);
    }
    
    public static class BlahClass {
        @JsonProperty("id")
        public Integer id;
        @JsonProperty("email")
        public String email;
        public boolean isThing;
    
        public BlahClass(Integer id, String email, boolean thing) {
            this.id = id;
            this.email = email;
            isThing = thing;
        }
    }