2

我在我的 RESTEasy 项目中使用 EclipseLink 的 MOXy 作为 JAXB 实现。由 @XmlDiscriminatorNode 和 Value 等注释带来的 MOXy 的高级功能对我帮助很大。除了一件事:JSON 支持之外,一切都运行良好。我正在使用 RESTEasy 的 JettisonMappedContext 但不幸的是,编组后只有实例变量字段属于我的 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"}

有没有其他方法可以实现这一目标?

谢谢你。

4

1 回答 1

4

更新 2

EclipseLink 2.4 与 MOXy 的 JSON 绑定一起发布:

更新 1

了解在 EclipseLink 2.4 中添加的本机 MOXy 对象到 JSON 绑定:


确保在模型类中包含一个名为 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 的更多信息,请参阅:

于 2011-04-04T15:21:07.870 回答