【问题标题】:Cannot parse XML using Jackson, model never gets populated无法使用 Jackson 解析 XML,模型永远不会被填充
【发布时间】:2019-11-25 11:33:04
【问题描述】:

我正在尝试使用 Jackson 库解析下面的 xml,但没有运气。我用我的模型尝试了一些东西,但我没有发现问题......

XML:

<?xml version="1.0" encoding="UTF-8"?>
<litre version="1.1" creator="Dummy Creator"  
    xsi:schemaLocation="http://www.dummy.com/xmlschemas/DummyExtension.xsd>
    <metadata>
        <link href="dummy.com">
            <text>Dummy</text>
        </link>
        <time>2012-10-24T23:22:51.000Z</time>
    </metadata>
    <krt>
        <name>Untitled</name>
        <geskrt>
            <pkrt data1="123" data2="321">
                <ints>100</ints>
                <time>2012-10-24T22:21:15.000Z</time>
                <extensions>
                    <axtpx:DummyExtension>
                        <xtpx:hor>40000</xtpx:hor>
                    </axtpx:DummyExtension>
                </extensions>
            </pkrt>
            <pkrt data1="543" data2="345">
                <ints>100</ints>
                <time>2012-10-24T23:29:40.000Z</time>
                <extensions>
                    <axtpx:DummyExtension>
                        <xtpx:hor>50000</xtpx:hor>
                    </axtpx:DummyExtension>
                </extensions>
            </pkrt>
        </geskrt>
    </krt>
</litre>

POJO:

@JacksonXmlRootElement(localName = "litre")
public @Data class Model {

    @JacksonXmlProperty(localName = "pkrt")
    @JacksonXmlElementWrapper(useWrapping = false)
    private List<Data> entries;

    public static @Data class Data {
        @JacksonXmlProperty(isAttribute = true, localName = "data1")
        private double dataOne;
        @JacksonXmlProperty(isAttribute = true, localName = "data2")
        private double dataTwo;
        @JacksonXmlProperty(localName = "ints")
        private double inters;
        private String time;
        @JacksonXmlProperty(namespace = "xtpx:hor")
        private long hours;
    }
}

在尝试反序列化时:

Model model = mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
                    .readValue(filePath.toFile(), Model.class);

解析总是毫无例外地通过,但是条目列表总是空的......

感谢您的帮助,谢谢!

【问题讨论】:

  • 你的根对象是元素 litre 而不是 geskrt - 你知道吗?
  • 是的,有点错字...我会编辑问题,谢谢。
  • 这应该如何工作?您跳过元素krtgeskrt 并假设杰克逊反序列化了内部?当您想像这样使用 Jackson 时,您必须将完整的 XML 结构建模为 Java 模型,而不仅仅是您认为对您有用的部分。

标签: java jackson jackson-dataformat-xml


【解决方案1】:

你肯定必须这样做:

@JacksonXmlRootElement(localName = "litre")
public @Data class Litre {

    @JacksonXmlProperty(localName = "krt")
    private Krt krt;

    public static @Data class Krt {

        @JacksonXmlProperty(localName = "geskrt")
        private Geskrt geskrt;
    }

    public static @Data class Geskrt {

        @JacksonXmlProperty(localName = "pkrt")
        @JacksonXmlElementWrapper(useWrapping = false)
        private List<Pkrt> pkrt;
    }

    public static @Data class Pkrt {

        @JacksonXmlProperty(isAttribute = true, localName = "data1")
        private double dataOne;

        @JacksonXmlProperty(isAttribute = true, localName = "data2")
        private double dataTwo;

        @JacksonXmlProperty(localName = "ints")
        private double inters;

        private String time;

        @JacksonXmlProperty(namespace = "xtpx:hor")
        private long hours;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-06
    • 2021-06-18
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 2020-03-16
    相关资源
    最近更新 更多