Почему я не могу развернуть и сериализовать карту Java, используя библиотеку Jackson Java?
Мой боб выглядит так:
class MyBean {
private @JsonUnwrapped HashMap<String, String> map = new HashMap<String, String>();
private String name;
public HashMap<String, String> getMap() {
return map;
}
public void setMap(HashMap<String, String> map) {
this.map = map;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Пока я сериализую компонент, используя следующий код:
MyBean bean = new MyBean();
HashMap<String, String> map = new HashMap<String, String>();;
map.put("key1", "value1");
map.put("key2", "value2");
bean.setMap(map);
bean.setName("suren");
ObjectMapper mapper = new ObjectMapper();
System.out.println("\n"+mapper.writeValueAsString(bean));
Я получаю такой результат:
{"map":{"key2":"value2","key1":"value1"},"name":"suren"}
но
{"key2":"value2","key1":"value1","name":"suren"}
ожидается в соответствии с документацией JacksonFeatureUnwrapping. Почему я не получаю развернутый результат?
Ответы
Ответ 1
@JsonUnwrapped
не работает для карт, только для правильных POJO с геттерами и сеттерами. Для карт Вы должны использовать @JsonAnyGetter
и @JsonAnySetter
(доступно в версии @JsonAnySetter
> = 1.6).
В вашем случае попробуйте это:
@JsonAnySetter
public void add(String key, String value) {
map.put(key, value);
}
@JsonAnyGetter
public Map<String,String> getMap() {
return map;
}
Таким образом, вы также можете напрямую добавлять свойства на карту, например, add('abc','xyz')
добавит новый ключ abc
на карту со значением xyz
.
Ответ 2
В настоящее время в проекте Джексона существует открытая проблема, позволяющая поддерживать @JsonUnwrapped
на Картах. Он не помечен как находящийся в будущих версиях Джексона 2.10 или 3.x, поэтому он не выглядит таковым в ближайшем будущем.
Пока эта функция не поддерживается, обходной путь использования @JsonAnySetter
/@JsonAnyGetter
предложенный в другом ответе, кажется @JsonAnyGetter
.