Jackson集合反序列化器接受空的xml标签

时间:2016-07-11 08:01:37

标签: java xml jackson deserialization

我面临以下问题。

作为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。 我期望在列表容器中相同。

0 个答案:

没有答案