【问题标题】:Converting XML String to Java Object Jackson / JAXB将 XML 字符串转换为 Java 对象 Jackson / JAXB
【发布时间】:2019-04-10 07:24:06
【问题描述】:

第一次在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 而不是 Jackson 吗?

【问题讨论】:

  • 试试这个:stackoverflow.com/questions/25556624/… - 顺便说一句:JAXB 并没有那么糟糕,如果使用得当也不会很慢。更新并不意味着更好...
  • 如果我处理的是 XML 文档的属性,那会起作用,但我只处理标记中的属性。我会试试上面的。
  • 没有像 XML 文档的“属性”这样的东西。只有元素和元素的属性。无论 JAXB、Jackson 还是其他任何东西,它们都将 POJO 作为属性转换为属性。更仔细地阅读给定的链接...您必须将 POJO List&lt;Book&gt; bookList 属性定义为根元素的元素 - 在您的情况下为 library

标签: java xml jackson jaxb jackson-databind


【解决方案1】:

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

  • 您需要@JacksonXmlPropertyisAttribute = false (告诉杰克逊你有&lt;book&gt;elements,但没有book = "...." 属性) 和localName = "book"(告诉杰克逊这些元素的名称)
  • 您需要@JacksonXmlElementWrapperuseWrapping = false (告诉杰克逊您没有围绕这些 &lt;book&gt; 元素的额外包装元素)
  • 顺便说一句:你不需要用= new ArrayList&lt;&gt;()初始化它,因为 Jackson 反序列化也会考虑到这一点。
@JacksonXmlProperty(isAttribute = false, localName = "book")
@JacksonXmlElementWrapper(useWrapping = false)
List<Book> bookList;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多