【问题标题】:How to deserialize XML with annotations using FasterXML如何使用 FasterXML 反序列化带有注释的 XML
【发布时间】:2014-07-01 04:42:25
【问题描述】:

我有以下 XML 架构:

<Courses semester="1">
    <Course code="A231" credits="3">Intermediate A</Course>
    <Course code="A105" credits="2">Intro to A</Course>
    <Course code="B358" credits="4">Advanced B</Course>
</Courses>

我需要把它转换成 POJO 为:

public class Schedule
{
   public int semester;
   public Course[] courses;
}

public class Course
{
   public String code;
   public int credits;
   public String name;
}

这里有两点需要注意:

  1. 课程对象未包含在标签中
  2. 有些属性是属性

我需要如何注释我的对象才能让 FasterXML 反序列化这个 xml?

【问题讨论】:

    标签: java xml jackson pojo fasterxml


    【解决方案1】:

    你必须在你的项目中添加jackson-dataformat-xml 依赖:

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

    之后就可以这样使用XML注解了:

    @JacksonXmlRootElement(localName = "Courses")
    class Schedule {
    
        @JacksonXmlProperty(isAttribute = true)
        private int semester;
    
        @JacksonXmlProperty(localName = "Course")
        private Course[] courses;
    
        // getters, setters, toString, etc
    }
    
    class Course {
    
        @JacksonXmlProperty(isAttribute = true)
        private String code;
    
        @JacksonXmlProperty(isAttribute = true)
        private int credits;
    
        @JacksonXmlText(value = true)
        private String name;
    
        // getters, setters, toString, etc
    }
    

    现在,您必须使用XmlMapper 而不是ObjectMapper

    JacksonXmlModule module = new JacksonXmlModule();
    module.setDefaultUseWrapper(false);
    XmlMapper xmlMapper = new XmlMapper(module);
    
    System.out.println(xmlMapper.readValue(xml, Schedule.class));
    

    上面的脚本打印:

    Schedule [semester=1, courses=[[code=A231, credits=3, name=Intermediate A], [code=A105, credits=2, name=Intro to A], [code=B358, credits=4, name=Advanced B]]]
    

    【讨论】:

    • 不幸的是,如果我没记错的话,@JacksonXmlText 在最新的杰克逊库中不再可用。你知道该怎么做吗?
    • @StefanoScarpanti,在 JavaDoc 中,2.11 版本仍然可用。 main project page 还描述了它是如何工作的,所以它应该在那里。你用的是哪个版本?
    • 好吧,你是对的,我强制在我的 pom 2.9.6 jackson 版本中,我可以使用这些注释。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    相关资源
    最近更新 更多