Jackson XmlMapper反序列化XML能否直接映射到子元素对应的Pojo类
解决方案
你直接反序列化到C类失败的核心原因是,当前XML的根节点是<a>,根节点下的字段是<b>和<c>,和C类的字段结构(<d>、<e>)不匹配,Jackson无法自动从根节点向下匹配到深层的<c>节点。
方案1:树节点中转(最推荐,无额外依赖、无需修改类定义)
你可以先把整个XML加载为Jackson的树模型,提取出<c>对应的子节点后,再单独反序列化为C类实例,代码示例:
XmlMapper xmlMapper = new XmlMapper(new JacksonXmlModule()); // 读取XML为树节点 JsonNode root = xmlMapper.readTree(new File("xml-file")); // 提取目标<c>节点 JsonNode cNode = root.get("c"); // 将子节点反序列化为C类对象 C target = xmlMapper.treeToValue(cNode, C.class);
这个方案完全不需要定义冗余的A包装类,也不需要修改现有C类的任何注解,适配性最强。
方案2:XPath定位后反序列化
如果需要更灵活的节点匹配逻辑,也可以借助JDK自带的XPath API先定位到<c>节点,再交给Jackson反序列化:
XmlMapper xmlMapper = new XmlMapper(new JacksonXmlModule()); // 加载XML文档 Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File("xml-file")); // XPath定位到c节点 XPath xpath = XPathFactory.newInstance().newXPath(); Node cNode = (Node) xpath.evaluate("/a/c", doc, XPathConstants.NODE); // 反序列化 C target = xmlMapper.readValue(cNode, C.class);
内容的提问来源于stack exchange,提问作者Martinek
相关产品推荐
相关产品推荐

