【问题标题】:FasterXML - Jackson XML extension translate values to null in pojoFasterXML - Jackson XML 扩展在 pojo 中将值转换为 null
【发布时间】:2018-08-04 11:03:54
【问题描述】:

我决定在我的项目中让 Jackson XML 有机会将 XML 字符串转换为 POJO。

所以我使用以下出色的web site 从我的 xml 字符串生成 pojo。

所以,它创建了我需要的类,然后我尝试将 xml 值读入这些对象。

不幸的是,对象中的一些值被设置为 null,我不知道为什么:

这是 xml 字符串的开头:

<?xml version="1.0" encoding="UTF-8"?>
<schedule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" generated_at="2018-02-23T16:55:45+00:00" xmlns="http://schemas.thesite.com/jobsapi/v1/myjob" xsi:schemaLocation="http://schemas.thesite.com/jobsapi/v1/myjob http://schemas.thesite.com/asb/myjob/v1/xml/endpoints/myjob/schedule.xsd">
    <job_event id="sr:task:12004724" scheduled="2018-02-23T17:00:00+00:00" start_time_tbd="false" status="not_started">
        <task type="group" number="23"/>

我的课程是:

public class Schedule
{
    private String generated_at;
    private String xmlns;
    private Job_event[] job_events;

    public String getGenerated_at ()
    {
        return generated_at;
    }

    public void setGenerated_at (String generated_at)
    {
        this.generated_at = generated_at;
    }

    public String getXmlns ()
    {
        return xmlns;
    }

    public void setXmlns (String xmlns)
    {
        this.xmlns = xmlns;
    }

    public Job_event[] getjob_events ()
    {
        return job_events;
    }

    public void setjob_events (Job_event[] job_events)
    {
        this.job_events = job_events;
    }

    @Override
    public String toString()
    {
        return "Schedule [generated_at = "+generated_at+", xmlns = "+xmlns+", job_events = "+job_events+"]";
    }
}

public class Job_event {

    private String id;
    private String scheduled;
    private String start_time_tbd;
    private String status;

        //more fields, getters and setters   
}

然后,我用它把字符串转换成 pojos:

ObjectMapper xmlMapper = new XmlMapper();
xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Schedule sched = xmlMapper.readValue(xmlString, Schedule.class);
Job_event[] job_events = sched.getJob_events();

我发现在 job_events 中的每个事件值中,id 和 status 等成员值都是空的。

这是为什么呢? xml字符串没问题。

谢谢!

【问题讨论】:

    标签: java xml jackson fasterxml jackson-dataformat-xml


    【解决方案1】:

    您可以通过以下方式修复它

    1. 使用@JacksonXmlProperty(isAttribute = true)注解将Pojo字段映射到XML属性
    2. 使用List 代替数组
    3. 使用@JacksonXmlElementWrapper(useWrapping = false) 注释表示您的列表List&lt;JobEvent&gt; 表示为重复的XML 元素。
    4. 我还认为您应该 annotate your fieldslocalName,以保持与 Java 命名约定的兼容

    之后会是这样的

    @JsonIgnoreProperties(ignoreUnknown = true)
    public class JobEvent {
        @JacksonXmlProperty(isAttribute = true)
        private String id;
        @JacksonXmlProperty(isAttribute = true)
        private String scheduled;
        @JacksonXmlProperty(isAttribute = true, localName = "start_time_tbd")
        private String startTimeTbd;
        @JacksonXmlProperty(isAttribute = true)
        private String status;
    
        @Override
        public String toString() {
            return id + " " + scheduled + " " + " " + startTimeTbd + " " + status;
        }
    }
    

    Schedule.java

    public class Schedule {
        @JacksonXmlProperty(isAttribute = true,localName="generated_at")
        public String generatedAt;
        @JacksonXmlProperty(isAttribute = true)
        public String xmlns;
         @JacksonXmlElementWrapper(useWrapping = false)
        public List<JobEvent> job_event;
    
        @Override
        public String toString()
        {
            return "Schedule [generated_at = "+generatedAt+", xmlns = "+xmlns+", job_events = "+job_event.toString()+"]";
        }
    }
    

    测试调用

    @Test
        public void readXmlToSelfDefinedPojo2() throws Exception {
    
            ObjectMapper mapper = new XmlMapper();
            Schedule pojo = mapper.readValue(
                            Thread.currentThread().getContextClassLoader().getResourceAsStream("48963966.xml"),
                            Schedule.class);
            System.out.println(pojo + "");
        }
    

    对于 XML 文件 48963966.xml

    将打印

    Schedule [generated_at = 2018-02-23T16:55:45+00:00, xmlns = null, job_events = [sr:task:12004724 2018-02-23T17:00:00+00:00  false not_started, sr:task:12004725 2018-02-25T17:00:00+00:00  false not_started]]
    

    【讨论】:

      猜你喜欢
      • 2021-02-12
      • 2022-07-24
      • 1970-01-01
      • 2014-01-31
      • 1970-01-01
      • 2017-03-07
      • 2017-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多