Группы повторяющихся элементов карты Джексона XML

Используя Джексон, мне нужно создать класс java, который можно будет маршалировать в соответствии с XML

<Root>
   <Key>key1</Key>
   <Value>value1</Value>
   <Key>key2</Key>
   <Value>value2</Value>
   ...
</Root>

Следующий класс закрыт, но порядок Key и Value неправильный.

@JacksonXmlRootElement(localName = "Root")
class Root {
    @JacksonXmlProperty(localName = "Key")
    private String[] keys;
    @JacksonXmlProperty(localName = "Value")
    private String[] values;
}

Как создать класс, который отображает повторяющиеся пары элементов в правильном порядке?

Этот может быть актуальным.
Aaron 06.09.2018 17:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
242
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я это сделал! с помощью настраиваемого сериализатора.

Во-первых, корневой элемент:

@JacksonXmlRootElement(localName = "Root")
class Root {
    @JacksonXmlElementWrapper(useWrapping = false)
    private List<Wrapper> keyValueList;
    // getters, setters
}

Класс-оболочка для пар Key и Value:

@JsonSerialize(using = WrapperSerializer.class)
class Wrapper {
    private String key;
    private String value;
    // getters, setters, all args constructors
}

И сериализатор:

public class WrapperSerializer extends StdSerializer<Wrapper> {
    public WrapperSerializer() {
        this(Wrapper.class);
    }

    protected WrapperSerializer(Class<Wrapper> t) {
        super(t);
    }

    @Override
    public void serialize(Wrapper value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeRaw(new StringBuilder()
                .append("<Key>")
                .append(value.getKey())
                .append("</Key>")
                .append("<Value>")
                .append(value.getValue())
                .append("</Value>")
                .toString());
    }
}

Давайте протестируем это:

Root ref = new Root();
ref.setKeyValueList(Arrays.asList(
        new Wrapper("k1", "v1"),
        new Wrapper("k2", "v2")));
XmlMapper xmlMapper = new XmlMapper();
String output = xmlMapper.writeValueAsString(ref);
System.out.println(output);

Результат:

<Root><Key>k1</Key><Value>v1</Value><Key>k2</Key><Value>v2</Value></Root>

Другие вопросы по теме