2016-06-27 2 views
1

У меня есть XML, который содержит карты сериализовать, как это:Пользовательские карты демаршаллизации с JAXB

<system> 
    ... 
    <entities> 
    <entity> 
     <string>key<string> 
     <string><![CDATA[["a", "b", "c"]]]></string> 
    </entity> 
    ... 
    </entities> 
</system> 

То, что я хотел бы получить от этого является то, что <entities> являются deserialised в Map<String, Object> с map.get(key) возвращает список строк.

class System { 
    ... 
    private Map<String, Object> properties; 
} 

Итак, вопрос в том, как заставить его работать с JAXB?

ответ

2

Вы должны использовать XmlAdapter и @XmlJavaTypeAdapter аннотацию.

Шаг 1: Создайте объект класса, который представляет ваш элемент <entity> и сопоставьте его с JAXB.

Шаг 2: Создайте класс, который расширяет XmlAdapter<List<Entity>,Map<String,Object> и определите методы рефератов marshall и unmarshall.

Шаг 3: Создание класса сущностей, как это:

@XmlRootElement 
@XmlSeeAlso({Entity.class}) 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Entities{ 

    @XmlElement(name="entity") 
    @XmlJavaTypeAdapter(YourAdapter.class) 
    private Map<String,Object> yourMap; 

    //getters, setters, and methods 
} 

Затем, когда вы маршализацию файл, вы будете иметь Entities объект, который содержит карту.

Скажите, пожалуйста, если вы столкнулись с проблемой, если это решение соответствует вашим потребностям, поэтому я могу отредактировать/добавить свой ответ.

EDIT:

Если Entities элемент не корневой элемент, то вы можете отобразить это следующим образом:

class ParentElement{ 

    //Other fields 

    @XmlElement(name="entities") 
    private Entities entities; 

    //Getters, Setters, Methods 
} 

И держать класс Entities

@XmlSeeAlso({Entity.class}) 
public class Entities{ 

    @XmlElement(name="entity") 
    @XmlJavaTypeAdapter(YourAdapter.class) 
    private Map<String,Object> yourMap; 

    //getters, setters, and methods 
} 
+0

Спасибо, единственная проблема, с которой я не могу обернуть голову, состоит в том, что не является XmlRootElement, а скорее как член более крупного объекта. Я обновлю свой первоначальный вопрос. – vasily

+0

Я обновил ответ, решает ли ваша проблема? –

+0

Спасибо, это было не напрямую, но вы, безусловно, помогли мне подняться на правильный путь. JAXB не нравится \ @XmlElementWrapper и \ @XmlJavaTypeAdapter в том же свойстве. Мне пришлось создать еще один объект для коллекции. – vasily

Смежные вопросы