public static class Something { private Map<String, String> prop; }
をJacksonでserializeすると
{ "prop": { "foo": "bar" } }
と,トップレベルにprop
のようなpropertyが出てくるので微妙……となるシチュエーションがまれによくあります.
で,どうすると良いかというと @JsonUnwrapped
を使うという方法がまず考えられると思うんですが,これは問題があって期待通りに動かない.かれこれ6年くらいチケットがオープンになっています: @JsonUnwrapped not supported for Map-valued properties · Issue #171 · FasterXML/jackson-databind · GitHub
public static class Something { @JsonUnwrapped private Map<String, String> prop; }
つまりこれは動かない.というわけでどうするかと言うと,チケット中にも示されているように@JsonAnyGetter
を使うという方法があります.
public static class Something { private Map<String, String> prop; // workaround: https://github.com/FasterXML/jackson-databind/issues/171#issuecomment-117794241 @JsonAnyGetter public Map<String, String> getProp() { return prop; } }
このようにすると,
{ "foo": "bar" }
というふうにトップレベルのpropertyが省略された,MapのKey-Valueがそのままserializeされることとなります.よかったよかった.