我不确定是否可以这样进行。
readTree方法返回其延伸对象
JsonNode,在这种情况下这将是
ObjectNode。
ObjectNode不接受具有相同名称的两个属性,最后反序列化后,它表示:
{"c":"c","as":"a2"}之后,您想将此节点转换为
A
POJOclass。
List预期
START_ARRAY令牌为not的默认反序列化器
String。您可以通过实现扩展的自定义转换器使其工作,
StdConverter<String,List>但列表将被修剪为一个元素。在这种情况下,我认为,你必须使用
readValue,因为您需要指示方法
Jackson是
as元素展开阵列。
编辑
在您发表评论后,我意识到我们可以欺骗
XmlMapper我们想要使用的任何东西。很明显,
Jackson用于
JsonNodeDeserializer反序列化
JsonNode-s。因此,我们要做的就是找到一个可以注入代码的地方。幸运的是,有一种方法
_handleDuplicateField可以处理我们的情况。默认情况下,如果
FAIL_ON_READING_DUP_TREE_KEY启用了标志,它将引发异常:
protected void _handleDuplicateField(JsonParser p, DeserializationContext ctxt, JsonNodeFactory nodeFactory, String fieldName, ObjectNode objectNode, JsonNode oldValue, JsonNode newValue) throws JsonProcessingException{ // [databind#237]: Report an error if asked to do so: if (ctxt.isEnabled(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY)) { ctxt.reportInputMismatch(JsonNode.class, "Duplicate field '%s' for ObjectNode: not allowed when FAIL_ON_READING_DUP_TREE_KEY enabled", fieldName); }}因此,让我们使用这个事实并扩展此类:
class MergeDuplicateFieldsJsonNodeDeserializer extends JsonNodeDeserializer { @Override protected void _handleDuplicateField(JsonParser p, DeserializationContext ctxt, JsonNodeFactory nodeFactory, String fieldName, ObjectNode objectNode, JsonNode oldValue, JsonNode newValue) throws JsonProcessingException { super._handleDuplicateField(p, ctxt, nodeFactory, fieldName, objectNode, oldValue, newValue); ArrayNode array; if (oldValue instanceof ArrayNode) { // Merge 3-rd, 4-th, ..., n-th element to already existed array array = (ArrayNode) oldValue; array.add(newValue); } else { // Merge first two elements array = nodeFactory.arrayNode(); array.add(oldValue); array.add(newValue); } objectNode.set(fieldName, array); }}现在,我们需要注册该反序列化器。整个测试如下所示:
import com.fasterxml.jackson.core.JsonParser;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.DeserializationContext;import com.fasterxml.jackson.databind.JsonNode;import com.fasterxml.jackson.databind.deser.std.JsonNodeDeserializer;import com.fasterxml.jackson.databind.module.SimpleModule;import com.fasterxml.jackson.databind.node.ArrayNode;import com.fasterxml.jackson.databind.node.JsonNodeFactory;import com.fasterxml.jackson.databind.node.ObjectNode;import com.fasterxml.jackson.dataformat.xml.XmlMapper;import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;import java.util.Arrays;import java.util.List;public class XmlMapperApp { public static void main(String[] args) throws Exception { A a = new A(); a.c = "String"; a.as = Arrays.asList("1", "2", "tom", "Nick"); SimpleModule mergeDuplicatesModule = new SimpleModule("Merge duplicated fields in array"); mergeDuplicatesModule.addDeserializer(JsonNode.class, new MergeDuplicateFieldsJsonNodeDeserializer()); XmlMapper mapper = new XmlMapper(); mapper.registerModule(mergeDuplicatesModule); String xml = mapper.writevalueAsString(a); System.out.println(xml); System.out.println(mapper.readTree(xml)); }}上面的代码打印:
<A><c>String</c><as>1</as><as>2</as><as>tom</as><as>Nick</as></A>{"c":"String","as":["1","2","tom","Nick"]}


