Java - Jackson - 如何将随机 XML 反序列化为 Map 的字符串值<String,String>,然后按原样序列化它

问题描述 投票:0回答:1

旧的描述不是我想要的,这是我想要的更新版本。

package jackson.serialzation;

import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;

import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) throws Exception {
        XmlMapper xmlMapper = new XmlMapper();
        System.out.println("Test 1");
        String test1 = "<Wrapper><a><b><c>3 &amp; 7 - 8 &lt; 9</c> </b></a></Wrapper>";

        Wrapper wrapper = xmlMapper.readValue(test1, Wrapper.class);
        System.out.println(wrapper.getMyMap().get("a"));
        String outputXML = xmlMapper.writeValueAsString(wrapper);
        System.out.println(outputXML);

        System.out.println("-----------------");

        System.out.println("Test 2");
        String test2 ="<Wrapper><a><![CDATA[<b><c>3 &amp; 7 - 8 &lt; 9</c> </b>]]></a></Wrapper>";

        wrapper = xmlMapper.readValue(test2, Wrapper.class);
        System.out.println(wrapper.getMyMap().get("a"));
        outputXML = xmlMapper.writeValueAsString(wrapper);
        System.out.println(outputXML);
    }
}

class Wrapper {
    private Map<String, String> myMap = new HashMap<>();

   @JsonAnyGetter
    public Map<String, String> getMyMap() {
        return myMap;
    }

    @JsonAnySetter
    @JacksonXmlProperty(localName = "myMap")
    @JacksonXmlElementWrapper(useWrapping = false)
    public void addToMap(String key, String value) {
        this.myMap.put(key, value);
    }
}

我想将元素

<a>
的任何子元素读取为
a
类中
myMap
的键
Wrapper
的字符串值。

上述代码的输出是:

Test 1

Test 1

<Wrapper><a></a></Wrapper>
-----------------
Test 2
<b><c>3 &amp; 7 - 8 &lt; 9</c> </b>
<Wrapper><a>&lt;b>&lt;c>3 &amp;amp; 7 - 8 &amp;lt; 9&lt;/c> &lt;/b></a></Wrapper>

理想情况下,我希望 Jackson 有一些注释允许在

Test 1
中实现这种行为(但是,它只是将键
a
的值打印为空,这不是我想要的)。

然后,我尝试使用

Test 2
CDATA
包裹在
<b>...</b>
周围,这样 Jackson 就可以反序列化
<b>...</b>
,就像它作为字符串值一样。但是当将
wrapper
对象序列化为 String 时,它会向我返回不需要的输出。

应该是:

<Wrapper><a><b><c>3 &amp; 7 - 8 &lt; 9</c> </b></a></Wrapper>

不是

<Wrapper><a>&lt;b>&lt;c>3 &amp;amp; 7 - 8 &amp;lt; 9&lt;/c> &lt;/b></a></Wrapper>

因此,如果 Jackson 可以反序列化

Test 1
中的字符串,那么它就可以序列化为与我想要的
String test1
完全相同的字符串。

java xml spring-boot serialization jackson
1个回答
-2
投票

这个问题用 Jackson 是没有答案的,所以最后为了保持

3 &lt; 7
的原样,我需要修改客户端来发布包裹在
<!CDATA[[3 &lt; 7]]>
中的 XML,然后 Jackson 不会将其转换为
3 < 7 
(这不是想要的行为)。

© www.soinside.com 2019 - 2024. All rights reserved.