【问题标题】:Can JAXB output an ArrayList as comma separated values?JAXB 可以将 ArrayList 输出为逗号分隔值吗?
【发布时间】:2011-04-25 14:35:44
【问题描述】:

我有类似的东西

@XmlElementWrapper(name="Mylist")
List<Items> myItems = new ArrayList<Items>()

结果就像

<Mylist>
   <myItems>item 1</myItems>
   <myItems>item 2</myItems>
   <myItems>item 3</myItems>
</Mylist>

有没有可能让这个出来更像

<Mylist>
   <myItems>item 1, item 2, item 3</myItems>
</Mylist>

既然我所追求的数据都是文本的?

【问题讨论】:

    标签: java xml jaxb marshalling


    【解决方案1】:

    您可以使用@XmlList 将其设为空格分隔值。

    对于逗号分隔的列表,您需要使用XmlAdapter。有关XmlAdapter 的更多信息,请参阅:

    【讨论】:

    • 你是说在新的适配器类中然后我会简单地将列表中的所有项目集中在一起,并在新创建的字符串上使用@XmlValue?
    • 是的,然后再往另一个方向发展,您可以在“,”字符上标记字符串。
    【解决方案2】:

    这是一个 XmlAdapter 来处理逗号分隔的列表:

    import java.util.ArrayList;
    import java.util.List;
    
    import javax.xml.bind.annotation.adapters.XmlAdapter;
    
    public class CommaSeparatedListAdapter extends XmlAdapter<String, List<String>> {
    
        @Override
        public List<String> unmarshal(final String string) {
            final List<String> strings = new ArrayList<String>();
    
            for (final String s : string.split(",")) {
                final String trimmed = s.trim();
    
                if (trimmed.length() > 0) {
                    strings.add(trimmed);
                }
            }
    
            return strings;
        }
    
        @Override
        public String marshal(final List<String> strings) {
            final StringBuilder sb = new StringBuilder();
    
            for (final String string : strings) {
                if (sb.length() > 0) {
                    sb.append(", ");
                }
    
                sb.append(string);
            }
    
            return sb.toString();
        }
    }
    

    你会这样使用它:

    @XmlElementWrapper(name="Mylist")
    @XmlJavaTypeAdapter(CommaSeparatedListAdapter.class)
    List<Items> myItems = new ArrayList<Items>()
    

    【讨论】:

      【解决方案3】:

      您可以通过使字段为瞬态@XmlTransient 并创建一个用逗号分隔的字符串计算方法来实现这一点。

      @XmlTransient
      List<Items> myItems = new ArrayList<Items>()
      
      @XmlElement(name = "myItems")
      public String getItemsAsCommasSeparated() {
          return String.join(", ", myItems);
      }
      

      关于包装&lt;Mylist&gt; 如果确实有必要,您将不得不将列表包装到另一个对象中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-14
        • 1970-01-01
        • 2017-06-22
        • 1970-01-01
        相关资源
        最近更新 更多