Using an objectmapper instance to deserialize a json list to a VO works fine, This VO uses @JsonValue, but uses springboot’s objectmapper, which results in an error.
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type Rankings
from Array value (token JsonToken.START_ARRAY
)
at [Source: (String)”[{“time”: 1718198341000, “account”: “Coder-001”, “maxScore”: “0.4247”, “submitCount”: 1}]”; line: 1, column: 1]
Here is my code, using lombok.
@Value
@AllArgsConstructor(onConstructor = @__(@JsonCreator))
public class Rankings {
@JsonValue
List<Ranking> rankings;
public List<Ranking> getRankings() {
return MoreObjects.firstNonNull(rankings, ImmutableList.of());
}
}
@Builder
@JsonIgnoreProperties(ignoreUnknown = true)
@AllArgsConstructor(onConstructor = @__(@JsonCreator))
@Value
public class Ranking implements Comparable<Ranking> {
@JsonProperty("account")
String account;
@JsonProperty("maxScore")
String maxScore;
@JsonProperty("submitCount")
Integer submitCount;
@JsonProperty("time")
Long time;
@Override
public int compareTo(Ranking o) {
int i = new BigDecimal(maxScore).compareTo(new BigDecimal(o.maxScore));
if (i != 0) {
return i;
}
return submitCount.compareTo(o.submitCount);
}
}
using a new ObjectMapper instance, everything works fine, and a error was throwed when using spring boot objectmapper bean.
// works fine
Rankings rankings = new ObjectMapper().readValue("[{"time": 1718198341000, "account": "Coder-001", "maxScore": "0.4247", "submitCount": 1}]", Rankings.class);
// com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `Rankings` from Array value (token `JsonToken.START_ARRAY`)
Rankings rankings = SpringContextHolder.getBean(ObjectMapper.class).readValue("[{"time": 1718198341000, "account": "Coder-001", "maxScore": "0.4247", "submitCount": 1}]", Rankings.class);
Now I’m confused, i wan’t to know the reason.
help