我面临以下问题。
作为XML Jackson库的用户,我想知道是否有可能反序列化包含null元素的XML
List
。
考虑以下课程:
public class TestJacksonList {
List<String> strings;
List<Integer> integers;
List<Path> paths;
public static final ObjectMapper XML_MAPPER = new XmlMapper()
.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
.setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE);
public static TestJacksonList parseXml(String content) throws IOException {
try {
TestJacksonList testJacksonList = XML_MAPPER.readValue(content, TestJacksonList.class);
return testJacksonList;
} catch (IOException e) {
throw e;
}
}
public List<String> getStrings() {
return strings;
}
public List<Path> getPaths() {
return paths;
}
public List<Integer> getIntegers() {
return integers;
}
}
我想要通过以下测试:
public class TestJacksonListTest {
@Test
public void should_deserialize_strings_tags() throws IOException {
// given
String inputXml = "<xml>" +
"<strings>" +
"<string>hello</string>" +
"<string>world</string>" +
"<string></string>" +
"</strings></xml>";
// when
TestJacksonList testJacksonList = TestJacksonList.parseXml(inputXml);
// then --> OK
Assertions.assertThat(testJacksonList.getStrings()).hasSize(3).containsOnly("hello", "world", "");
}
@Test
public void should_deserialize_integer_tags() throws IOException {
// given
String inputXml = "<xml>" +
"<integers>" +
"<integer>12</integer>" +
"<integer></integer>" +
"<integer>32</integer>" +
"</integers></xml>";
// when
TestJacksonList testJacksonList = TestJacksonList.parseXml(inputXml);
// then --> KO
Assertions.assertThat(testJacksonList.getIntegers()).hasSize(3);
}
@Test
public void should_deserialize_path_tags() throws IOException {
// given
String inputXml = "<xml>" +
"<paths>" +
"<path>hello</path>" +
"<path>world</path>" +
"<path></path>" +
"</paths></xml>";
// when
TestJacksonList testJacksonList = TestJacksonList.parseXml(inputXml);
// then --> KO
Assertions.assertThat(testJacksonList.getPaths()).hasSize(3);
}
}
以下是我注意到的事情:
String
的列表包含空元素,这没关系。它后来被解释为空字符串(因为Jackson
使用特定的StringCollectionDeserializer
)其他列表类型使用不接受空标记的通用CollectionDeserializer
。它会触发异常:
com.fasterxml.jackson.databind.JsonMappingException: 无法从START_OBJECT标记中反序列化java.lang.Integer的实例 在[来源:java.io.StringReader@6fe7aac8; line:1,column:46](通过引用链:com.altirnao.migrationtools.core.model.configuration.TestJacksonList [&#34;整数&#34;] - &gt; java.util.ArrayList 1)
我调查了DeserialisationFeature
,但似乎没有一个符合我的情况。
当代码为空时,我希望List
包含null
。
我们可能会争辩说,在列表容器标记中放置一个空标记是没有意义的,但是我要解析的XML
会被非技术用户修改。
最后但并非最不重要的是,如果标记未嵌套,则它可以为空,即表示路径字段的标记可以为空,并且将反序列化为null。 我期望在列表容器中相同。