【问题标题】:Jackson List Help - Java杰克逊列表帮助 - Java
【发布时间】:2013-06-09 02:09:06
【问题描述】:

我正在尝试使用 Jackson 创建一些 xml,但无法按我的需要显示列表。我得到:

<Messages>
  <Messages>...</Messages>
  <Messages>...</Messages>
</Messages>

我希望它看起来像:

<Messages>
  <Message>...</Message>
  <Message>...</Message>
</Messages>

我的代码如下所示:

  public List<Message> messages;

无论我如何命名该变量,所有子元素的名称都是相同的。我确信这已经在其他地方得到了回答,但我找不到任何可以解决我的问题的东西。感谢您的帮助。

【问题讨论】:

  • 你能发布你的Message课程吗?

标签: java xml jackson


【解决方案1】:

我找到了一种无需添加更多依赖项的简单方法。您只需使用注释:

@JacksonXmlElementWrapper(localName = "Messages")
@JacksonXmlProperty(localName = "Message")

这个问题为我指明了正确的方向。 Jackson XML globally set element name for container types。 您也可以在 github 页面here

上阅读有关此注释的信息

【讨论】:

  • 恭喜你找到了更优雅的解决方案。
  • 上帝保佑你和你的灵魂
【解决方案2】:

试试这样的 JAXB 注解:

 @XmlElementWrapper(name = "Messages")
  // XmlElement sets the name of the entities
  @XmlElement(name = "Message")
  public List<Message> messages;

请参阅http://wiki.fasterxml.com/JacksonJAXBAnnotations,了解在 Jackson 中使用 JAXB 注释。

这里有一个很好的 JAXB 教程:

http://www.vogella.com/articles/JAXB/article.html

这里:

https://jaxb.java.net/tutorial/index.html

【讨论】:

  • @jhamm 如果您还没有这样做,您还需要添加 jackson-xc jar 作为依赖项。您还需要告诉 ObjectMapper 使用 JAXB 注释。请参阅wiki.fasterxml.com/JacksonJAXBAnnotations 中的“注册 JAXB 注释内省”部分
【解决方案3】:

这对于字符串列表非常有效。

XML

<Messages>
     <Message>msg1</Message>
     <Message>msg2</Message>
     <Message>msg3</Message>
</Messages>

杰克逊密码

@JacksonXmlElementWrapper(localName = "Messages")
@JacksonXmlProperty(localName = "Message")
public List<String> messages;

【讨论】:

    【解决方案4】:

    您也可以尝试使用:

    @JacksonXmlRootElement(localName = "Messages")
    class Messages{
        @JacksonXmlProperty(localName = "Message")
        List<String> message = new ArrayList<>();
    
        public List<String> getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
           this.message.add(message);
        }
    }
    

    【讨论】:

      【解决方案5】:

      作为另一种选择,您可以通过更改 XML 来做到这一点而无需注释。您可以将 XML 更改为,

      <messages>
        <Message>
          <value>"foo"</value>
        </Message>
        <Message>
          <value>"bar"</value>
        </Message>
      </messages>
      

      并将 Java 更改为

      class Foobar {
        List<Message> messages;
      }
      class Message {
        String value;
      }
      

      然后 Messages 将包含 Message 类的两个对象,一个值成员等于“foo”,另一个值成员等于“bar”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-21
        • 1970-01-01
        • 1970-01-01
        • 2015-05-02
        • 2015-02-04
        • 2012-10-01
        • 1970-01-01
        相关资源
        最近更新 更多