Преобразование HashMapв XML с JAXB - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь маршалировать объект в XML, этот объект расширяется HashMap<String, List<String>>.Однако мне неясно, почему вывод не содержит данных, введенных в этот объект.Метод, используемый для преобразования этого объекта в XML, можно найти в конце вопроса.

Пример 1 (фактическая ситуация)

Структура данных:

@XmlRootElement
class WhatIWant extends HashMap<String, List<String>> {

}

Какиезаполняется с помощью:

WhatIWant what = new WhatIWant();
what.put("theKey", Arrays.asList("value1", "value2"));

Полученный результат выглядит следующим образом, введенные данные нигде не найдены.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<whatIWant/>

Пример 2 (ситуация, которая генерирует ожидаемый результат)

Нечто подобное работает, и я ожидал, что выходные данные первого примера будут выглядеть примерно так.

Структура данных:

@XmlRootElement
class MyHashmap {
    public HashMap<String, MyList> map = new HashMap<>();
}

class MyList {
    public List<String> list = new ArrayList<String>();
}

Заполнено с использованием:

MyHashmap requirement = new MyHashmap();
MyList t = new MyList();
t.list = Arrays.asList("value1", "value2");
requirement.map.put("theKey", t);

Полученный результат:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<myHashmap>
    <map>
        <entry>
            <key>theKey</key>
            <value>
                <list>value1</list>
                <list>value2</list>
            </value>
        </entry>
    </map>
</myHashmap>

Метод объекта в XML

Метод, который я использовал для преобразования объектов в XML:

public static String getObjectAsXML(Object obj) {
    try {
        // Create marshaller
        JAXBContext context = JAXBContext.newInstance(obj.getClass());
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        // Marshall the object
        StringWriter sw = new StringWriter();
        marshaller.marshal(obj, sw);

        return sw.toString();
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

Вопрос

  1. Почему Example 1 не генерирует вывод, похожий на тот, что в Example 2?Почему ничего не генерирует вообще?
  2. Что нужно сделать, чтобы получить вывод XML для такой структуры, как Example 1?Или это невозможно?

1 Ответ

0 голосов
/ 29 ноября 2018

Причина может быть в следующем: элементы, которые нужно маршалировать / не маршалировать, должны быть открытыми или иметь аннотацию XMLElement.

В первом примере корневой класс не имеет открытых элементов, тогда каквторой делает.Вы можете попытаться добавить (в первый пример) открытый метод получения, возвращающий записи карты (и добавить соответствующий @XmlAccessorType в класс WhatIWant), и посмотреть, дает ли он ожидаемые результаты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...