Привязка общего класса Java к JSON с использованием JAXB - PullRequest
5 голосов
/ 06 августа 2010

У меня есть следующий класс Java

@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;
    }

}

Я создаю его экземпляр и собираю его в json

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

У меня следующий результат:

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

Я не хочу иметь информацию о типе типа в json "@ type": "dataClass" , другими словами, я хочу получить следующий результат:

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

Именно этоУ меня есть результат, когда EnvelopeClass не имеет Generics.

Есть ли способ сделать это?

1 Ответ

6 голосов
/ 09 августа 2010

Чтобы получить желаемое поведение, вы можете использовать @XmlAnyElement в свойстве data вместо @XmlElement. Для свойства @XmlAnyElement значение будет соответствовать классу с соответствующей аннотацией @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; 
    } 

}

Демо

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);
    }
}
...