2010-08-06 23 views
5

mam następujące klasy javaOprawa Generic klasy Javy do JSON przy użyciu JAXB

@XmlRootElement 
@XmlSeeAlso(DataClass.class) 
public static class EnvelopeClass<T> { 

    @XmlElement 
    public String version; 

    @XmlElement 
    public T data; 

    EnvelopeClass() { 
    } 

    EnvelopeClass(String version, T data) { 
     this.version = version; 
     this.data = data; 
    } 

} 

@XmlRootElement 
public static class DataClass { 

    @XmlElement 
    public String name; 

    DataClass() { 
    } 

    DataClass(String name) { 
     this.name = name; 
    } 

} 

Tworzę swoje wystąpienie i Organizowanie go do JSON

EnvelopeClass<DataClass> dataClassEnvelopeClass = new EnvelopeClass<DataClass>("1.0", new DataClass("myName")); 

mam następny wynik:

{"version":"1.0","data":{"@type":"dataClass","name":"myName"}} 

nie chcę mieć informacje o typie typ w json "@type": "dataClass", innymi słowy chcę mieć kolejny wynik:

{"version":"1.0","data":{"name":"myName"}} 

właśnie ten wynik mam kiedy EnvelopeClass nie posiada Generics.

Czy istnieje sposób, aby to zrobić?

+0

Kiedy próbuję to z "waniliowy" JAXB w java6, nie wiem uzyskać to, dostaję < 1.0 myName ', gdzie' xsi: type' określa sposób generowania generics w JAXB. – skaffman

Odpowiedz

6

Aby uzyskać pożądane zachowanie, można użyć @XmlAnyElement we właściwości danych zamiast @XmlElement. W przypadku właściwości @XmlAnyElement wartość będzie odpowiadać klasie z pasującą adnotacją @XmlRootElement.

EnvelopeClass

import javax.xml.bind.annotation.XmlAnyElement; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlSeeAlso; 

@XmlRootElement 
@XmlSeeAlso(DataClass.class) 
public class EnvelopeClass<T> { 

    @XmlElement 
    public String version; 

    @XmlAnyElement 
    public T data; 

    EnvelopeClass() { 
    } 

    EnvelopeClass(String version, T data) { 
     this.version = version; 
     this.data = data; 
    } 

} 

DataClass

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name="data") 
public class DataClass { 

    @XmlElement 
    public String name; 

    DataClass() { 
    } 

    DataClass(String name) { 
     this.name = name; 
    } 

} 

Demo

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

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(EnvelopeClass.class); 

     DataClass data = new DataClass("myName"); 
     EnvelopeClass envelope = new EnvelopeClass<DataClass>("1.0", data); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(envelope, System.out); 
    } 
} 
Powiązane problemy