Поддержка MOXy JSON - PullRequest
       6

Поддержка MOXy JSON

2 голосов
/ 01 апреля 2011

Я использую MOXy EclipseLink в качестве реализации JAXB в моем проекте RESTEasy. Продвинутая функциональность MOXy, которая была представлена ​​аннотациями, такими как @XmlDiscriminatorNode & Value, мне очень помогла. Все работает нормально, кроме одного: поддержка JSON. Я использую JettisonMappedContext из RESTEasy, но, к сожалению, в моем JSON после маршалинга есть только поля переменных экземпляра, принадлежащие абстрактному суперклассу.

@XmlRootElement
@XmlDiscriminatorNode("@type")
public abstract class Entity {

    public Entity(){}

    public Entity(String id){
        this.id = id;
    }

    private String id;

    @XmlElement
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
}

Подкласс:

@XmlRootElement
@XmlDiscriminatorValue("photo")
public class Photo extends Entity{

    private String thumbnail;

    public Photo(){}

    public Photo(String id) {
        super(id);
    }

    public void setThumbnail(String thumbnail) {
        this.thumbnail = thumbnail;
    }

    @XmlElement(name="thumbnail")
    public String getThumbnail() {
        return thumbnail;
    }
}

XML после сортировки:

<object type="photo">
   <id>photoId423423</id>
   <thumbnail>http://dsadasadas.dsadas</thumbnail>
</object>

JSON после сортировки:

"object":{"id":"photoId423423"}

Есть ли другой способ добиться этого?

Спасибо.

1 Ответ

4 голосов
/ 04 апреля 2011

ОБНОВЛЕНИЕ 2

EclipseLink 2.4 выпущен с привязкой JSON MOXy:

ОБНОВЛЕНИЕ 1

Получить скрытую вершину нативной привязки MOXy-объекта к JSON, добавляемой в EclipseLink 2.4:

Убедитесь, что вы включили файл с именем jaxb.properties в классы вашей модели, который содержит следующую запись:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

Без этой записи будет использоваться эталонная реализация и EclipseLinkРасширения JAXB (MOXy) не будут отображаться в результирующем XML / JSON.

Используя пример @ DescrimatorNode из моего блога, полученный XML будет выглядеть так:

<customer>
   <contactInfo classifier="address-classifier">
      <street>1 A Street</street>
   </contactInfo>
</customer>

Когда я соберусь с помощью Jettison:

StringWriter strWriter = new StringWriter();
MappedNamespaceConvention con = new MappedNamespaceConvention();
AbstractXMLStreamWriter w = new MappedXMLStreamWriter(con, strWriter);
marshaller.marshal(customer, w);
System.out.println(strWriter.toString());

Затемполучите следующий JSON:

{"customer":{"contactInfo":{"@classifier":"address-classifier","street":"1 A Street"}}}

Для получения дополнительной информации о JAXB и JSON см .:

...