杰克逊XML解析

时间:2014-04-30 18:00:11

标签: java xml jackson

Jackson 2.2.3

首先,请原谅这个愚蠢的错误,我在一个断开的网络上,所以我不得不手动重新打字)

我有以下XML:

<orgs>
    <org name="Test1">
        <item>a</item>
        <item>b</item>
    </org>
    <org name="Test2">
        <item>c</item>
        <item>d</item>
        <item>e</item>
    </org>
</orgs>

我有以下类来解析它:

@XmlRootElement(name = "orgs")
@XmlAccessorType(XmlAccessType.FIELD)
public class XmlOrgElements {

    private List<Org> orgs;

    public List<Org> getOrgs() {
        return orgs;
    }

    public void setOrg(List<Org> orgs) {
        this.orgs = orgs;
    }

    public class Org {
        @JacksonXmlProperty(isAttribute = true)
        private String name;
        private List<Item> items;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public List<Item> getItems() {
            return items;
        }

        public void setName(List<Item> items) {
            this.items = items;
        }
    }

    public class Item {
        @JacksonXmlText
        private String item;

        public String getItem() {
            return item;
        }

        public void setItem(String item) {
            this.item = item;
        }
    }
}

但我回来的只是“orgs = null”。有谁知道为什么?

2 个答案:

答案 0 :(得分:4)

您需要为列表启用展开处理;默认是使用“包装”格式。诊断此问题的最佳方法是从Java对象开始,序列化为XML,并查看输出格式是什么。 这给出了结构如何不同的想法。

如果您想默认为展开样式,可以使用:

JacksonXmlModule module = new JacksonXmlModule();
module.setDefaultUseWrapper(false);
mapper.registerModule(module);

还有一个注释@JacksonXmlElementWrapper

public class Bean {
  @JacksonXmlElementWrapper(useWrapping=false)
  public List<Stuff> entry;
}

以每个列表属性为基础更改行为。

答案 1 :(得分:0)

以下是那些阅读的答案:

@JacksonXmlRootElement(localname = "orgs")
public class Orgs {
    @JacksonXmlElementWrapper(useWrapping = false)
    private List<Org> org;

    public List<Org> getOrg() {
        return org;
    }

    public void setOrg(List<Org> org) {
        this.orgs = org;
    }

    public Orgs() {}
}


public class Org {
    @JacksonXmlProperty(isAttribute = true)
    private String name;
    @JacksonXmlElementWrapper(useWrapping = false)
    private List<String> item;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<String> getItem() {
        return item;
    }

    public void setItem(List<String> item) {
        this.item = item;
    }
}
相关问题