Xml 序列化 JAXB 与 Jackson-dataformat-xml?
Xml serialization JAXB vs Jackson-dataformat-xml?
我有一个 XSD,我想从中支持 JSON 和 XML 数据格式 serialization/deserialization。
我使用 xjc
实用程序生成了我的模型 类。
到目前为止,我已经使用 Jackson JSON 库处理了 JSON 数据。
我无法修改我的 Java 类,因此我将 ObjectMapper
配置为 Mix-In annotations
和其他功能,例如 PropertyNamingStrategy
(更改字段名称),SerializationFeature.WRAP_ROOT_VALUE
通过代码为我的序列化提供配置。
现在我想对 XML 序列化过程做同样的事情。
我已经在线阅读了各种选项:
- JAXB
- Jackson 库 + Jackson-dataformat-xml.jar
- XStream
哪个最适合我的情况(无法使用注释编辑我的 POJO,只允许代码配置)??
我投票给答案 #2:使用 Jackson-dataformat-xml。我们遇到了类似的情况,发现通过 Jackson 序列化到 XML 比预期的要容易。这是因为 XmlMapper
扩展了 ObjectMapper
,所以我们所有的配置更改(混入、使用 JavaTimeModule
等)都可以直接应用于 XmlMapper
,并且它们刚刚起作用。
您已经将 Jackson 配置为根据需要输出数据,所以最困难的部分已经完成。我建议利用您已经投入的精力并使用 Jackson-dataformat-xml.
我投票给 #2 Jackson 库 + Jackson-dataformat-xml.jar
看看 JSON 和 XML 的代码,这里和那里的位更改是一样的。
主类
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
public class MainClass {
public static void main(String[] args) throws JsonProcessingException {
// Serialization: java obj to json--> writeValueAsString
// DeSerialization: json to java obj--> ReadValue
XmlMapper mapper1 = new XmlMapper();
ObjectMapper mapper2 = new ObjectMapper();
mapper1.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
mapper2.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
mapper1.enable(SerializationFeature.INDENT_OUTPUT);
mapper2.enable(SerializationFeature.INDENT_OUTPUT);
MyPojo mypojo = new MyPojo();
mypojo.setName("Dhani");
mypojo.setId("18082013");
mypojo.setAge(5);
String jsonStringXML = mapper1.writeValueAsString(mypojo);
String jsonStringJSON = mapper2.writeValueAsString(mypojo);
// takes java class with def or customized constructors and creates JSON
System.out.println("XML is " + "\n" + jsonStringXML + "\n");
System.out.println("Json is " + "\n" + jsonStringJSON);
} }
MyPojo.java
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
@JsonPropertyOrder({ "name", "age", "id", "note" })
@JacksonXmlRootElement(namespace = "urn:stackify:jacksonxml", localName = "myPOJO")
public class MyPojo {
@JsonProperty("_id")
private String id;
private String name;
private int age;
@JsonIgnore
private String note;
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
} }
结果
XML
<myPOJO xmlns="urn:stackify:jacksonxml">
<name xmlns="">Dhani</name>
<age xmlns="">5</age>
<_id xmlns="">18082013</_id>
</myPOJO>
Json
{
"name" : "Dhani",
"age" : 5,
"_id" : "18082013"
}
我为我的 XML serialization/deserialization 选择了 JAXB,因为我已经有了一个 XML 模式,并且想要 XML JAXB 提供的原生模式 XML 图书馆。即使 Jackson xml 也是一个不错的选择,如果它适合您的需要。
Jackson XML 模块的局限性:
Jackson 中的 XML 模块绝不是为了完全替代 JAXB 而设计的。某些结构在 JAXB 和 Jackson 之间的工作方式会略有不同,并且不能保证 Jackson 会产生与 JAXB 相同的 XML。
请注意,与 JSON 不同,最外层的对象必须是 bean 类型——它不能是原始类型或包装类型、枚举或集合。这是 XML 工作方式的直接结果——XML 无法表示这样的顶级值。
默认情况下,Jackson 将始终对集合使用包装器元素,这也与 JAXB 的工作方式不同。这是 Jackson 生成的 XML 与 JAXB 生成的 XML 不兼容的主要方式。当然,可以配置行为,使用一个字段的 JacksonXmlElementWrapper 注释或全局 XmlMapper 上的 setDefaultUseWrapper 配置设置。
Jackson 也不支持使用特定的 XML 模式。 它设计用于首先编写 Java Beans,而不是从预先存在的模式生成 Java 代码。 请注意,这可以在一定程度上通过使用JAXB 注释支持并使用标准 xjc 工具生成 bean。
同样,它不支持一些更高级的 XML 工具——例如 XPath 或 XSLT。如果我们需要这种级别的支持,那么我们应该使用功能更全面的 XML 解决方案。
总结:
如果您正在寻找一种成熟、灵活的方式来支持和使用 JSON 和 XML 处理相同的数据,Jackson XML 模块是一个很棒的库杠杆作用。它不仅是一种可靠的独立方式,而且还有一个额外的好处,即能够为 XML 和 JSON.
重用大部分相同的配置
通常,这必须使用两个具有完全独立配置的不同库来处理。
最后,除了灵活性和易用性之外,Jackson 团队历来非常重视性能。鉴于数据编组和解组是大多数 Web 应用程序的重要组成部分,选择正确的库来处理所有这些工作至关重要。再加上 Retrace 等性能监控工具,您可以充分利用您的应用程序。
我有一个 XSD,我想从中支持 JSON 和 XML 数据格式 serialization/deserialization。
我使用 xjc
实用程序生成了我的模型 类。
到目前为止,我已经使用 Jackson JSON 库处理了 JSON 数据。
我无法修改我的 Java 类,因此我将 ObjectMapper
配置为 Mix-In annotations
和其他功能,例如 PropertyNamingStrategy
(更改字段名称),SerializationFeature.WRAP_ROOT_VALUE
通过代码为我的序列化提供配置。
现在我想对 XML 序列化过程做同样的事情。
我已经在线阅读了各种选项:
- JAXB
- Jackson 库 + Jackson-dataformat-xml.jar
- XStream
哪个最适合我的情况(无法使用注释编辑我的 POJO,只允许代码配置)??
我投票给答案 #2:使用 Jackson-dataformat-xml。我们遇到了类似的情况,发现通过 Jackson 序列化到 XML 比预期的要容易。这是因为 XmlMapper
扩展了 ObjectMapper
,所以我们所有的配置更改(混入、使用 JavaTimeModule
等)都可以直接应用于 XmlMapper
,并且它们刚刚起作用。
您已经将 Jackson 配置为根据需要输出数据,所以最困难的部分已经完成。我建议利用您已经投入的精力并使用 Jackson-dataformat-xml.
我投票给 #2 Jackson 库 + Jackson-dataformat-xml.jar 看看 JSON 和 XML 的代码,这里和那里的位更改是一样的。
主类
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
public class MainClass {
public static void main(String[] args) throws JsonProcessingException {
// Serialization: java obj to json--> writeValueAsString
// DeSerialization: json to java obj--> ReadValue
XmlMapper mapper1 = new XmlMapper();
ObjectMapper mapper2 = new ObjectMapper();
mapper1.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
mapper2.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
mapper1.enable(SerializationFeature.INDENT_OUTPUT);
mapper2.enable(SerializationFeature.INDENT_OUTPUT);
MyPojo mypojo = new MyPojo();
mypojo.setName("Dhani");
mypojo.setId("18082013");
mypojo.setAge(5);
String jsonStringXML = mapper1.writeValueAsString(mypojo);
String jsonStringJSON = mapper2.writeValueAsString(mypojo);
// takes java class with def or customized constructors and creates JSON
System.out.println("XML is " + "\n" + jsonStringXML + "\n");
System.out.println("Json is " + "\n" + jsonStringJSON);
} }
MyPojo.java
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
@JsonPropertyOrder({ "name", "age", "id", "note" })
@JacksonXmlRootElement(namespace = "urn:stackify:jacksonxml", localName = "myPOJO")
public class MyPojo {
@JsonProperty("_id")
private String id;
private String name;
private int age;
@JsonIgnore
private String note;
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
} }
结果
XML
<myPOJO xmlns="urn:stackify:jacksonxml">
<name xmlns="">Dhani</name>
<age xmlns="">5</age>
<_id xmlns="">18082013</_id>
</myPOJO>
Json
{
"name" : "Dhani",
"age" : 5,
"_id" : "18082013"
}
我为我的 XML serialization/deserialization 选择了 JAXB,因为我已经有了一个 XML 模式,并且想要 XML JAXB 提供的原生模式 XML 图书馆。即使 Jackson xml 也是一个不错的选择,如果它适合您的需要。
Jackson XML 模块的局限性:
Jackson 中的 XML 模块绝不是为了完全替代 JAXB 而设计的。某些结构在 JAXB 和 Jackson 之间的工作方式会略有不同,并且不能保证 Jackson 会产生与 JAXB 相同的 XML。
请注意,与 JSON 不同,最外层的对象必须是 bean 类型——它不能是原始类型或包装类型、枚举或集合。这是 XML 工作方式的直接结果——XML 无法表示这样的顶级值。
默认情况下,Jackson 将始终对集合使用包装器元素,这也与 JAXB 的工作方式不同。这是 Jackson 生成的 XML 与 JAXB 生成的 XML 不兼容的主要方式。当然,可以配置行为,使用一个字段的 JacksonXmlElementWrapper 注释或全局 XmlMapper 上的 setDefaultUseWrapper 配置设置。
Jackson 也不支持使用特定的 XML 模式。 它设计用于首先编写 Java Beans,而不是从预先存在的模式生成 Java 代码。 请注意,这可以在一定程度上通过使用JAXB 注释支持并使用标准 xjc 工具生成 bean。
同样,它不支持一些更高级的 XML 工具——例如 XPath 或 XSLT。如果我们需要这种级别的支持,那么我们应该使用功能更全面的 XML 解决方案。
总结:
如果您正在寻找一种成熟、灵活的方式来支持和使用 JSON 和 XML 处理相同的数据,Jackson XML 模块是一个很棒的库杠杆作用。它不仅是一种可靠的独立方式,而且还有一个额外的好处,即能够为 XML 和 JSON.
重用大部分相同的配置通常,这必须使用两个具有完全独立配置的不同库来处理。
最后,除了灵活性和易用性之外,Jackson 团队历来非常重视性能。鉴于数据编组和解组是大多数 Web 应用程序的重要组成部分,选择正确的库来处理所有这些工作至关重要。再加上 Retrace 等性能监控工具,您可以充分利用您的应用程序。