我正在使用 Jackson XML 2.8.9,不幸的是我找不到任何方法将空/空集合序列化为空节点。
负责序列化为 XML 的方法:
protected byte[] toXml(final Collection<ReportView> reports) throws IOException
{
final XmlMapper mapper = new XmlMapper();
// place for code which will solve my problem
return mapper.writerWithDefaultPrettyPrinter().withRootName("report").writeValueAsBytes(reports);
}
我尝试使用:
-
序列化包含:
mapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
-
序列化提供者:
final XmlSerializerProvider provider = new XmlSerializerProvider(new XmlRootNameLookup());
provider.setNullValueSerializer(new JsonSerializer<Object>()
{
@Override
public void serialize(final Object value, final JsonGenerator jgen, final SerializerProvider provider) throws IOException
{
jgen.writeString("");
}
});
mapper.setSerializerProvider(provider);
-
Jackson 2.9.0 EMPTY_ELEMENT_AS_NULL 功能:
mapper.configure(FromXmlParser.Feature.EMPTY_ELEMENT_AS_NULL, false);
不幸的是没有任何效果。有人知道如何实现它吗?
测试方法:
@Test
public void testToXml() throws IOException
{
final Map<String, Object> payload = new LinkedHashMap<>();
payload.put("amp", "&");
payload.put("empty", Collections.emptyList());
final Date date = new Date();
final ReportView reportView = new ReportView(payload, date, "system");
// when
final byte[] xmlBytes = reportService.toXml(Arrays.asList(reportView));
// then
final StringBuilder expected = new StringBuilder();
expected.append("<report>");
expected.append(" <item>");
expected.append(" <payload>");
expected.append(" <amp>&</amp>");
expected.append(" <empty></empty>");
expected.append(" </payload>");
expected.append(" <timestamp>" + date.getTime() + "</timestamp>");
expected.append(" <changingUser>system</changingUser>");
expected.append(" </item>");
expected.append("</report>");
final String xmlText = new String(xmlBytes).replace("\n", "").replace("\r", "");
assertThat(xmlText).isEqualTo(expected.toString());
}
ReportView
class:
public class ReportView {
private final Map<String, Object> payload;
private final Date timestamp;
private final String changingUser;
public ReportView(Map<String, Object> payload, Date timestamp, String changingUser) {
this.payload = payload;
this.timestamp= timestamp;
this.changingUser = changingUser;
}
public String getChangingUser() {
return changingUser;
}
public Date getTimestamp() {
return timestamp;
}
public Map<String, Object> getPayload() {
return payload;
}
}
我准备了一个包含示例代码的存储库:https://github.com/agabrys/bugs-reports/tree/master/jackson-xml/empty-elements-serialization
EDIT:
我延长了测试时间toXml
方法并进行了一些代码清理。
我还尝试创建一个基于的解决方案Module
and SerializerModifier
。可惜两者都以失败告终。我创建了一个问题jackson-dataformat-xml
积压:
- 使用自定义实现覆盖映射序列化器后的 NPE (XmlBeanSerializerModifier.modifyMapSerializer)
EDIT:
我有一个如何解决异常问题的提示(请参阅使用自定义实现覆盖映射序列化器后的 NPE (XmlBeanSerializerModifier.modifyMapSerializer))但仍然没有解决丢失的问题empty/null
values.