Как сделать маршалл HashMap используя JAXB - PullRequest
2 голосов
/ 23 апреля 2020

Я пытаюсь маршалировать HashMap>, но ArrayList приходит как пустой в результате xml.

Я попробовал следующий код.

POJO -

@XmlRootElement(name = "crossreference")
@XmlAccessorType(XmlAccessType.FIELD)
public class CrossReference implements Serializable {

    private static final long serialVersionUID = 1L;

    HashMap<String, ArrayList<String>> testMap = new HashMap<>();

    public HashMap<String, ArrayList<String>> getTestMap() {
        return testMap;
    }

    public void setTestMap(HashMap<String, ArrayList<String>> testMap) {
        this.testMap = testMap;
    }

    @Override
    public String toString() {
        return "CrossReference [testMap=" + testMap + "]";
    }

Код Маршаллу,

        ArrayList<String> nameList = new ArrayList<>();
        nameList.add("Shivling");
        nameList.add("Bipin");
        nameList.add("Sudhakar");

        HashMap<String, ArrayList<String>> testMap = new HashMap<>();
        testMap.put("name", nameList);

        CrossReference crossReference = new CrossReference();
        crossReference.setTestMap(testMap);

        JAXBContext context = JAXBContext.newInstance(CrossReference.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); // To format XML
        StringWriter stringWriter = new StringWriter();
        marshaller.marshal(crossReference, stringWriter);
        String xml = stringWriter.toString();

        System.out.println(xml);

XML после выполнения Маршаллинга -

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<crossreference>
    <testMap>
        <entry>
            <key>name</key>
            <value/>
        </entry>
    </testMap>
</crossreference>

Я не уверен, почему значение пусто выше XML. Пожалуйста, помогите мне решить эту проблему.

Я ожидаю XML со всеми именами, как показано ниже,

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <crossreference>
        <testMap>
            <entry>
                <key>name</key>
                <value>Shivling</value>
                <value>Bipin</value>
                <value>Sudhakar</value>
            </entry>
        </testMap>
    </crossreference>

1 Ответ

1 голос
/ 23 апреля 2020

Прежде всего, вы не можете получить такой результат, используя такую ​​структуру, поскольку Map имеет только один value. Хотя value является списком элементов, для карты это все еще одно значение.

JAXB не может обрабатывать сложные / вложенные структуры данных, такие как Map<String, List<String>>. Вы должны создать обертку ex. WrappedStringList для значений карты, т.е. Map<String, WrappedStringList>.

class WrappedStringList {

    private List<String> wrapped;

    // getter & setter
}

Он будет использоваться в объекте CrossReference, например:

@XmlElementWrapper(name = "testMap")
HashMap<String, WrappedStringList> testMap = new HashMap<>();

Результат выглядит следующим образом :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<crossreference>
    <testMap>
        <entry>
            <key>name</key>
            <value>
                <wrapped>Shivling</wrapped>
                <wrapped>Bipin</wrapped>
                <wrapped>Sudhakar</wrapped>
            </value>
        </entry>
    </testMap>
</crossreference>
...