Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Duplicate values in the output of ObjectMapper.writeValueAsString

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"}
like image 780
Sudarshan Murthy Avatar asked Jul 15 '26 03:07

Sudarshan Murthy


1 Answers

This problem appears with older versions of Jackson e.g. 1.9.2 but not the latest ones from com.fasterxml. Jackson identifies 2 fields one from the @JsonTypeInfo annotation and one from the getter. Two solutions :

  1. Use a more recent version of Jackson from com.fasterxml
  2. Move the @JsonTypeInfo annotation over the getter instead of over the field e.g.

    @JsonTypeInfo(use = Id.NAME, include = As.EXTERNAL_PROPERTY, property = "characterName")
    public String getCharacterName() {
        return characterName;
    }
    
like image 120
Manos Nikolaidis Avatar answered Jul 20 '26 22:07

Manos Nikolaidis



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!