【问题标题】:Jacskon XML serialization of a listJackson XML 序列化列表
【发布时间】:2018-07-18 21:46:56
【问题描述】:

编辑:我正在尝试从 Java 对象序列化为 XML 标记。

我正在努力使用 Jackson 从一个大小为 N 的整数列表中序列化一些 XML。

我想从可变长度的整数列表中输出以下 XML [9, 2, ... , 7]。

<tagName>
   <thing1>9</thing1>
   <thing2>2</thing2>
   ...
   <thingN>7</thingN>
<tagName>

我在这里找不到任何用于处理反序列化列表的资源。

我设法得到的最接近的是

@JacksonXmlProperty(localName = "thing")
private List<Integer> thingList;

而且我不知道如何为列表中的每个成员的本地名称添加一个计数器。

任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 不是很清楚:您是要序列化到所需的标记还是反序列化到包含List 的类?还是两者兼而有之?
  • 也许您应该考虑将序列化为地图,以便获得 &lt;thing&gt;&lt;key&gt;1&lt;/key&gt;&lt;value&gt;9&lt;/value&gt;&lt;thing&gt; 您的 xml 不应该在其标签中真正携带值。
  • @Ben 您的 Xml 包含 Jackson 的未知属性。 92 thing1 , thing2 ..thingN 不是相等的属性。在从 xml 解析它之前,您有一个解决方法。
  • @Ben Thomas,我在下面添加了一个示例解决方案检查它是否对您有用?
  • @Dragonthoughts 这个 XML 格式是第三方 API 需要的,我没有控制权

标签: java xml jackson serialization


【解决方案1】:
    Ok Now I got your problem. So We I tried It with Jsoup library and find below code snippet for your work.

        public static void main(String[] args) {

                int [] array={1,2,3,4,5};
                TagName name = new TagName();
               //initialize the TagName object
               for (int a=0;a<array.length;a++) {
                    name.setThingList(array[a]);
               }

                XmlMapper xmlMapper = new XmlMapper();
                try {
                    //get object as a string
                    String value = xmlMapper.writeValueAsString(name);
                   //First you need to parse the xml
                    Document doc = Jsoup.parse(value, "", Parser.xmlParser());
                  //get tagname object
                    Element tagname = doc.getElementsByTag("tagname").first();
                  //get tagname's children which are thing
                    Elements childs = tagname.children();
                    for (int a = 0; a < childs.size(); ) {
                       //rename their tagname
                        childs.get(a).tagName("thing" + ++a);
                    }
                    System.out.println(tagname);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

<tagname>
 <thing1>
  1
 </thing1>
 <thing2>
  2
 </thing2>
 <thing3>
  3
 </thing3>
 <thing4>
  4
 </thing4>
 <thing5>
  5
 </thing5>
</tagname>
    @JacksonXmlRootElement(localName = "xml")
    public class TagName {

        public ArrayList<Integer> getThingList() {
            return thingList;
        }

        public void setThingList(Integer thing) {

            this.thingList.add(thing);

        }

        @JacksonXmlElementWrapper(localName = "tagname")
        @JacksonXmlProperty(localName = "thing")
        private ArrayList<Integer> thingList = new ArrayList<>();

    }

【讨论】:

  • 这样的文本操作是危险的。最好在解析XML时或解析后解决。
  • 您可以使用安全的方式来 String input = "" + " 9" + " 2" + " 7" + ""; input = input.replaceAll("g[0-9]>", "g>");//删除事物标签中的数字 input = input.replaceAll("gN>", "g>");//重命名thingN 标记到事物 这样做?但是在解析的时候出现问题后我们如何解决呢。我们必须在我想之前就这样做
  • 使用此代码 @JacksonXmlElementWrapper(localName = "tagname") @JacksonXmlProperty(localName = "thing") private ArrayList&lt;Integer&gt; thingList = new ArrayList&lt;&gt;(); 对我来说非常有用,可以用一个值命名一个列表,同时用不同的值保留列表中的项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 2018-08-15
  • 1970-01-01
  • 2017-01-11
  • 2013-12-06
  • 2018-10-26
  • 1970-01-01
相关资源
最近更新 更多