注意: 我是EclipseLink JAXB (MOXy)负责人,也是JAXB (JSR-222)专家组的成员。
JAXB (JSR-222) 规范不包括 JSON 绑定。在 REST/JAX-RS 上下文中,由提供者将 JAXB 映射规则应用于 JSON 表示。今天使用了 3 种不同的方法:
- 将 JAXB 实现与Jettison 之类的库一起使用。Jettison 实现了 StAX 接口,但解释了 JSON。这种方法的优点是它可以与任何 JAXB 实现一起使用来生成/使用 JSON,这种方法的缺点是 Jettison 没有足够的信息来进行完美的 JSON 表示。Jettison 在
"true"
不知道对应的 Java 类型是什么的情况下接收到 String,因此它决定将其表示为 JSON 布尔值,因为大多数情况下它可能是所需的输出。
- REST/JAX-RS 实现利用特定的 JAXB 实现来生成 JSON。这种方法与第一种方法类似,除了 REST/JAX-RS 提供者对 JAXB 提供者进行专有调用,以对 JSON 表示应该是什么做出更有根据的猜测。
- JAXB 实现提供了 JSON 绑定实现。目前 EclipseLink MOXy 是唯一支持 JSON 绑定的 JAXB 实现。
莫西示例
根
下面是一个带有String
和boolean
字段的域对象。我还添加了带有注释的字段@XmlSchemaType
,可用于覆盖默认表示。
package forum11145933;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
String barString;
boolean barBoolean;
@XmlSchemaType(name="boolean")
String barStringWithXmlTypeBoolean;
@XmlSchemaType(name="string")
boolean barBooleanWithXmlTypeString;
}
jaxb.properties
要将 MOXy 指定为您的 JAXB 提供程序,您需要添加一个jaxb.properties
在与您的域模型相同的包中调用的文件,其中包含以下条目:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
演示
以下代码演示了如何将域对象编组为 JSON。请注意,MOXy 没有编译时依赖项。
package forum11145933;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Root.class);
Root root = new Root();
root.barString = "true";
root.barBoolean = true;
root.barStringWithXmlTypeBoolean = "true";
root.barBooleanWithXmlTypeString = true;
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty("eclipselink.media-type", "application/json");
marshaller.marshal(root, System.out);
}
}
输出
以下是运行Demo
代码的输出。注意boolean
和String
属性是如何正确写出的。还要注意@XmlSchemaType
注释的使用如何允许我们将 a 编组boolean
为 a String
,反之亦然。
{
"root" : {
"barString" : "true",
"barBoolean" : true,
"barStringWithXmlTypeBoolean" : true,
"barBooleanWithXmlTypeString" : "true"
}
}
MOXy & JAX-RS
MOXy 包括MOXyJsonProvider
可用于在您的 JAX-RS 环境中启用 MOXy 作为 JSON 提供程序的功能: