旧的描述不是我想要的,这是我想要的更新版本。
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 & 7 - 8 < 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 & 7 - 8 < 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 & 7 - 8 < 9</c> </b>
<Wrapper><a><b><c>3 &amp; 7 - 8 &lt; 9</c> </b></a></Wrapper>
理想情况下,我希望 Jackson 有一些注释允许在
Test 1
中实现这种行为(但是,它只是将键 a
的值打印为空,这不是我想要的)。
然后,我尝试使用
Test 2
将 CDATA
包裹在 <b>...</b>
周围,这样 Jackson 就可以反序列化 <b>...</b>
,就像它作为字符串值一样。但是当将 wrapper
对象序列化为 String 时,它会向我返回不需要的输出。
应该是:
<Wrapper><a><b><c>3 & 7 - 8 < 9</c> </b></a></Wrapper>
不是
<Wrapper><a><b><c>3 &amp; 7 - 8 &lt; 9</c> </b></a></Wrapper>
因此,如果 Jackson 可以反序列化
Test 1
中的字符串,那么它就可以序列化为与我想要的 String test1
完全相同的字符串。
这个问题用 Jackson 是没有答案的,所以最后为了保持
3 < 7
的原样,我需要修改客户端来发布包裹在 <!CDATA[[3 < 7]]>
中的 XML,然后 Jackson 不会将其转换为 3 < 7
(这不是想要的行为)。