栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用Jackson XmlWrapper在类中处于第二个状态时,无法反序列化(转换)展开的列表

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用Jackson XmlWrapper在类中处于第二个状态时,无法反序列化(转换)展开的列表

我不确定是否可以这样进行。

readTree
方法返回其延伸对象
JsonNode
,在这种情况下这将是
ObjectNode
ObjectNode
不接受具有相同名称的两个属性,最后反序列化后,它表示:

{"c":"c","as":"a2"}

之后,您想将此节点转换为

A

POJO
class。
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"]}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/446728.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号