Duplicate values in the output of ObjectMapper.writeValueAsString

Viewed 3879

I am using Jackson ObjectMapper to (de)serialize a class with polymorphic nested class. The deserialization of JSON to the class is working fine but when I try to serialize the class to JSON using writeValueAsString function I observe duplicate values in the output

public class Movie {

    private String movieName;

    @JsonTypeInfo(use=Id.NAME,include=As.EXTERNAL_PROPERTY,property="movieName")
    @JsonSubTypes({@JsonSubTypes.Type(value = StarWarsParams.class, name = "starwars")})
    private MovieParams movieParams;

    /* Getters and setters follow */
}

/* Empty class */
public class MovieParams {

}

public class StarWarsParams extends MovieParams{

    private String characterName;

    @JsonTypeInfo(use=Id.NAME,include=As.EXTERNAL_PROPERTY,property="characterName")
    @JsonSubTypes({@JsonSubTypes.Type(value = SithParameters.class, name = "Darth Vader")})
    private CharacterParams characterParams;

    /* Getters and setters follow */
}
/* Empty class */
public class CharacterParams {

}
public class SithParameters extends CharacterParams {

    private boolean canShootLightning;
}

The code snippet where the conversion is done as follows:

Movie movie = new Movie();
movie.setMovieName("starwars");

StarWarsParams starWarsParams = new StarWarsParams();
starWarsParams.setCharacterName("Darth Vader");

SithParameters sithParameters = new SithParameters();
sithParameters.setCanShootLightning(false);

starWarsParams.setCharacterParams(sithParameters);

movie.setMovieParams(starWarsParams);

ObjectMapper mapper = new ObjectMapper();
String jsonStringSample = mapper.writeValueAsString(movie);
System.out.println(jsonStringSample);

The output, in which movieName and characterName have duplicates are as follows:

{"movieName":"starwars","movieParams":{"characterName":"Darth Vader","characterParams":{"canShootLightning":false},"characterName":"Darth Vader"},"movieName":"starwars"}
2 Answers
Related