Подтвердить что ты не робот

Почему я не могу развернуть и сериализовать карту 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. Почему я не получаю развернутый результат?

4b9b3361

Ответ 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.