2015-06-04 2 views
7

Я использую MOXy 2.6 (JAXB + JSON).Избегайте создания типа/значения обертки объекта в MOXy (JAXB + JSON)

Я хочу, чтобы ObjectElement и StringElement выполнялись одинаково, но MOXy создает объект-оболочку, когда поля вводятся как Object.

ObjectElement.java

public class ObjectElement { 
    public Object testVar = "testValue"; 
} 

StringElement.java

public class StringElement { 
    public String testVar = "testValue"; 
} 

Demo.java

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 

import org.eclipse.persistence.jaxb.JAXBContextFactory; 
import org.eclipse.persistence.jaxb.MarshallerProperties; 
import org.eclipse.persistence.oxm.MediaType; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContextFactory.createContext(new Class[] { ObjectElement.class, StringElement.class }, null); 
     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON); 

     System.out.println("ObjectElement:"); 
     ObjectElement objectElement = new ObjectElement(); 
     marshaller.marshal(objectElement, System.out); 
     System.out.println(); 

     System.out.println("StringElement:"); 
     StringElement stringElement = new StringElement(); 
     marshaller.marshal(stringElement, System.out); 
     System.out.println(); 
    } 

} 

При запуске Demo.java, вот выход ...

ObjectElement: 
{"testVar":{"type":"string","value":"testValue"}} 
StringElement: 
{"testVar":"testValue"} 

Как настроить Moxy/JAXB сделать ObjectElement визуализации как объект StringElement? Как избежать создания обертки объекта с помощью «type» и «value» Недвижимость?

ответ

2

вы можете использовать Аннотацию javax.xml.bind.annotation.XmlAttribute. Это сделает ObjectElement и StringElement одним и тем же выходом.

Смотрите следующий пример:

import javax.xml.bind.annotation.XmlAttribute; 

public class ObjectElement { 
    @XmlAttribute 
    public Object testVar = "testValue"; 
} 

я использовал следующий test class для проверки правильного поведения.

EDIT после вопрос был обновлен:

Да, это возможно. Вместо использования XmlAttribute, как и раньше, я переключился на javax.xml.bind.annotation.XmlElement в сочетании с атрибутом типа.

Класс теперь объявлен как:

public class ObjectElement { 
    @XmlElement(type = String.class) 
    public Object testVar = "testValue"; 
} 
+0

Есть ли у вас какие-либо другое решение? Я желаю, чтобы он также работал с XML без создания атрибута, но значение должно быть текстовым содержимым testValue. – Toilal

+0

да это возможно. см. мой обновленный ответ, а также пример кода на github. –

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