【问题标题】:Why doesn't Jackson XML deserialization respect any annotations?为什么 Jackson XML 反序列化不尊重任何注释?
【发布时间】:2019-06-24 06:11:35
【问题描述】:

我一直在阅读有关 Jackson XML 反序列化的教程(#1#2)。我尝试通过编写一些 java 代码来跟随示例:

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.xml.XmlMapper;

public class JacksonDemo {
    @JsonPropertyOrder({"age", "id", "name"})
    public static class Person {
        @JsonProperty("_id")
        public String id;
        public String name;
        public int age;
        @JsonIgnore
        public String note;
    }

    public static void main(String[] args) throws Exception {
        XmlMapper mapper = new XmlMapper();
        Person value = new Person();
        value.age = 4;
        value.id = "12345";
        value.name = "George";
        value.note = "Invalid";
        String s = mapper.writeValueAsString(value);
        System.out.println(s);
    }
}

根据教程,这应该会产生以下输出:

<Person><age>4</age><_id>12345</_id><name>George</name></Person>

但是,它反而会导致以下错误输出:

<Person><id>12345</id><name>George</name><age>4</age><note>Invalid</note></Person>

属性的顺序不正确,“id”字段包含不正确的 XML 元素,并且“note”字段包含不正确。据说,各种 java 注释应该会改变 Jackson 的行为,但似乎所有注释都被忽略了。有人知道这是为什么吗?

这适用于 jackson-xml-databind 0.6.2、jackson-annotations 2.6.0 和 jackson 2.6.5。

【问题讨论】:

    标签: java xml jackson


    【解决方案1】:

    jackson-xml-databind 版本 0.6.2 发布于 Nov 11, 2011。在链接的文章中,建议使用jackson-dataformat-xml 库。

    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
        <version>2.9.0</version>
    </dependency>
    

    最新版本是2.9.8,我建议使用它。您可以在下面找到 Maven 依赖项,您的示例应该按预期工作:

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>${jackson.version.core}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson.version.core}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
        <version>${jackson.version.core}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>${jackson.version.core}</version>
    </dependency>
    

    其中jackson.version.core2.9.8

    【讨论】:

    • 当 XML 解析库有 8 年历史时,我感到很惊讶。这解释了一切,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-08-25
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    相关资源
    最近更新 更多