2010-08-06 31 views
5

Tôi có lớp java sauRàng buộc một Java Class Generic đến một JSON sử dụng 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; 
    } 

} 

tôi là tạo ra cá thể của nó và marshaling nó để JSON

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

Tôi có kết quả tiếp theo:

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

Tôi không muốn có thông tin loại loại trong json "@type": "dataClass", nói cách khác tôi muốn có kết quả tiếp theo:

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

Chính xác kết quả này tôi có khi EnvelopeClass không có Generics.

Có cách nào để thực hiện việc này không?

+0

Khi tôi thử điều này với các "vanilla" JAXB trong Java6, tôi không nhận được điều đó, tôi nhận được ' 1.0 myName ', trong đó' xsi: type' là cách generics được cho là thực hiện trong JAXB. – skaffman

Trả lời

6

Để có được hành vi mong muốn, bạn có thể sử dụng @XmlAnyElement trên thuộc tính dữ liệu thay vì @XmlElement. Đối với thuộc tính @XmlAnyElement, giá trị sẽ tương ứng với một lớp có chú thích @XmlRootElement phù hợp.

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); 
    } 
} 
Các vấn đề liên quan