如何使用Jackson将XML字符串解析到已存在的SimpleBean实例?
如何用Jackson将XML解析到已有的Bean实例中
你希望将XML字符串解析到已创建的SimpleBean实例中,而非创建新实例,但之前的尝试要么无效要么无法编译。
核心问题分析
- 调用
xmlMapper.readValue(xml, this.getClass())时,Jackson会创建一个新的SimpleBean实例,但不会将新实例的属性同步到当前对象,所以原实例的属性没有变化。 - Java中
this是不可修改的引用常量,直接给this赋值(this = xmlMapper.readValue(...))属于语法错误,无法编译。
正确实现方式
Jackson的XmlMapper提供了重载的readValue方法,可以直接将解析结果赋值给已有的对象实例。修改fromString方法如下:
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.dataformat.xml.XmlMapper; public class SimpleBean { private int x = 1; private int y = 2; // 保留原有的getter和setter方法 public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } // 优化:将XmlMapper设为静态常量,避免重复创建实例 private static final XmlMapper xmlMapper = new XmlMapper(); public void fromString(String xml) throws JsonProcessingException { // 直接将XML解析到当前实例this中 xmlMapper.readValue(xml, this); } }
原理说明
xmlMapper.readValue(xml, this)会将XML解析出的数据,通过类中的setter方法(如setX、setY)赋值给当前this实例的属性。- 必须确保类中存在对应属性的setter方法,Jackson默认依赖setter完成属性赋值(如果需要直接操作字段,可以通过配置
XmlMapper开启字段可见性)。
验证测试
修改后的fromString方法可以让你的testFromStringWanted测试用例正常通过:
@Test void testFromStringWanted() throws Exception { SimpleBean bean = new SimpleBean(); String xml = "<SimpleBean><x>11</x><y>22</y></SimpleBean>"; bean.fromString(xml); Assertions.assertEquals(11, bean.getX()); // 现在会成功 }
内容的提问来源于stack exchange,提问作者SiKing
相关产品推荐
相关产品推荐

