我正在使用Jackson v2.5.3将Java Bean序列化为XML。该课程如下:
@XmlRootElement(name="ROOT")
public class classA{
@XmlElement
String aString;
@XmlElement
String bString;
}
我遇到的问题是偶尔会收到XML输出:
<?xml version="1.0" encoding="utf-8"?>
<classA>
<aString></aString>
<bString></bString>
</classA>
我们期望的应该是:
<?xml version="1.0" encoding="utf-8"?>
<ROOT>
<aString></aString>
<bString></bString>
</ROOT>
似乎根节点名称错误。使用了类名而不是@XmlRootElement的定义。
答案 0 :(得分:0)
要在Jackson中启用对JAXB注释的支持,您需要在Jackson 2.5.3中包含此依赖项:
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
<version>2.4.0</version>
</dependency>
在XmlMapper中注册JaxbAnnotationModule模块。
XmlMapper xmlMapper = new XmlMapper();
JaxbAnnotationModule module = new JaxbAnnotationModule();
xmlMapper.registerModule(module);
杰克逊2.5.3产生了这个XML:
<ROOT xmlns="">
<aString/>
<bString/>
</ROOT>
杰克逊2.9.0产生了这个XML:
<ROOT>
<aString/>
<bString/>
</ROOT>
为了进一步完全渲染,您需要自定义序列化。
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
class EmptySerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
jgen.writeString("");
}
}
并在您的映射器中注册:
XmlSerializerProvider provider = new XmlSerializerProvider(new XmlRootNameLookup());
provider.setNullValueSerializer(new EmptySerializer());
xmlMapper.setSerializerProvider(provider);
这会产生您想要的格式。
<ROOT>
<aString></aString>
<bString></bString>
</ROOT>