将XML字符串转换为Java对象Jackson / JAXB

时间:2018-11-06 20:42:32

标签: java xml jackson jaxb jackson-databind

第一次在stackoverflow上发帖,而不是寻求帮助!

我有一堆XML,试图将其反序列化为一个简单的Java对象。

我有以下XML斑点:

<library>
    <book index="654" name="Harry Potter" price="£11.99" rating="5"/>
    <book index="7893" name="Ready Player One" price="£16.99" rating="5"/>
    <book index="433" name="Piers Morgan; Don't You Know Who I Am?" price="£8.99" rating="2"/>
</library>

然后我试图将其转换为简单的POJO:

@JacksonXmlRootElement(localName = "library")
public class Library {
    //This will be the breaking point :'(
    List<Book> bookList = new ArrayList<>();
}

public class Book {
    @JacksonXmlProperty(isAttribute = true)
    Integer index;

    @JacksonXmlProperty(isAttribute = true)
    String name;

    @JacksonXmlProperty(isAttribute = true)
    String price;

    @JacksonXmlProperty(isAttribute = true)
    Integer rating;
}

我正在努力寻找在Jacksons文档中使用的正确注释。我敢肯定,这肯定是一个非常简单的更改,就像通常一样!

我选择Jackson而不是JAXB,因为Jackson是较新的库,并且我知道与JAXB相关的一些速度问题。

无论我在这里尝试多么努力,我总是被卡在书本清单之外,没有任何条目。有人可以帮忙吗?有人会推荐我看看杰克逊上的JAXB吗?

1 个答案:

答案 0 :(得分:0)

如您所料,您只需要在List<Book>属性上添加一些注释, 使Jackson的反序列化可以与您的XML内容一起正常工作:

  • 您需要@JacksonXmlPropertyisAttribute = false (告诉杰克逊您有<book>个元素,但没有book = "...."个属性) 和localName = "book"(告诉杰克逊这些元素的名称)
  • 您需要@JacksonXmlElementWrapperuseWrapping = false (告诉Jackson,您在这些<book>元素周围没有其他包装元素)
  • 顺便说一句:您不需要使用= new ArrayList<>()对其进行初始化,因为 杰克逊的反序列化也将为此提供帮助。
@JacksonXmlProperty(isAttribute = false, localName = "book")
@JacksonXmlElementWrapper(useWrapping = false)
List<Book> bookList;