【问题标题】:Jackson XML globally set element name for container typesJackson XML 为容器类型全局设置元素名称
【发布时间】:2012-10-15 21:24:01
【问题描述】:

我正在使用带有 XML dataformat module 的 Jackson 1.9.2。我需要调整 Jackson 序列化数组、列表、集合的方式。

默认情况下,使用名为 myProperty 的 int 数组属性包含几个数字,Jackson / XML 生成以下内容:

<myProperty>
  <myProperty>1</myProperty>
  <myProperty>2</myProperty>
</myProperty>

我需要制作的是:

<myProperty>
  <item>1</item>
  <item>2</item>
</myProperty>

我可以在每个 POJO 的基础上使用 JacksonXmlElementWrapperJacksonXmlProperty 的组合来执行此操作,如下所示:

@JacksonXmlElementWrapper(localname='myProperty')
@JacksonXmlProperty(localname='item')
public int[] myProperty;

然而,这个解决方案需要我手动将这些注释应用到我的 POJO 中的每个数组、列表、集合。一个更好的解决方案将允许我在全局范围内为所有数组、列表、集合类型应用一个解决方案。有关如何实施此类解决方案的任何想法?

谢谢!

【问题讨论】:

    标签: java xml xml-serialization jackson


    【解决方案1】:

    您可以将 XML 模块提供的 AnnotationIntrospector 子类化,并覆盖检查 @JacksonXmlElementWrapper 的方法,并使其返回您想要的任何包装器名称。

    【讨论】:

    • 我喜欢这种方法。有什么线索可以为@JacksonXmlProperty(localName='item') 做同样的事情吗?
    • 是的,该注释也通过AnnotationIntrospector 处理,因此您可以重写它。
    • 很抱歉,我看到它可以用findSerializablePropertyName 完成,但我不能简单地从该方法返回"item":我需要在上下文时选择性地返回"item"位于非地图容器类型(列表、数组或集合)中。以这种方式调理findSerializablePropertyName是我不知道该怎么做。
    • 您传递的对象可以转换为实际的AnnotatedFieldAnnotatedMethod,这使您可以更多地访问以查看它是否匹配。但根据您的需要,可能没有足够的信息。
    • 不幸的是,我还没有找到一种简单的方法来获取我需要的信息以使其可行 - 不过再次感谢您的建议。
    【解决方案2】:

    我最终创建了自己的 JsonGenerator 来为我的团队需要支持的旧格式生成 XML。

    我本来希望使用 Jackson XML 数据格式模块,它提供更高的安全性、更多的测试,并且可能更快。不幸的是,我无法使用 StaxMan 的建议找到解决方案。

    【讨论】:

    • 这很不幸,但可以理解。还有一个建议:如果您要绕过数据绑定,则还必须使用原始 Stax (XML) api(请参阅javax.xml.stream.XMLStreamWriter)。用于内容生成相对简单,高效(如果您需要多个作者,请记住重复使用XMLOutputFactory)。
    • 感谢您的建议。为什么需要使用?在我的JsonGeneratorBase 子类中,我只是将Strings 写入流。
    • 我强烈劝阻任何人不要使用字符串编写来编写 XML —— 这不会处理“有趣字符”的转义。 XMLStreamWriter 通常也比字符串连接更快。
    猜你喜欢
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 2016-09-12
    • 1970-01-01
    相关资源
    最近更新 更多