如何用Jackson XML反序列化带r/g/b/a属性的java.awt.Color?
解决Jackson XML反序列化Color属性的问题
问题背景
现有遗留系统中,Gadget类的Color字段通过自定义ColorSerializer序列化后,会将RGBA值转为<gadget>节点的r/g/b/a属性,但反序列化时Jackson提示r属性未知,无法还原为java.awt.Color实例。
解决方案
需要实现自定义反序列化器,从<gadget>节点的属性中提取RGBA值构建Color,同时配置Jackson忽略未知属性避免报错。
1. 实现ColorDeserializer
从XML节点的属性中读取r/g/b/a值,生成Color实例:
public class ColorDeserializer extends StdDeserializer<Color> { public ColorDeserializer() { super(Color.class); } @Override public Color deserialize(JsonParser parser, DeserializationContext context) throws IOException { XmlParser xmlParser = (XmlParser) parser; JsonNode node = xmlParser.getCodec().readTree(parser); // 读取属性,设置默认值防止空指针 int r = node.has("r") ? node.get("r").asInt() : 0; int g = node.has("g") ? node.get("g").asInt() : 0; int b = node.has("b") ? node.get("b").asInt() : 0; int a = node.has("a") ? node.get("a").asInt() : 255; // 默认完全不透明 return new Color(r, g, b, a); } }
2. 配置Gadget类的反序列化器
在color字段上添加@JsonDeserialize注解,指定使用自定义反序列化器:
public class Gadget { @JacksonXmlProperty @JsonDeserialize(using = ColorDeserializer.class) private Color color; // 其他字段、构造方法、getter/setter }
3. 配置XmlMapper忽略未知属性
因为<gadget>节点的r/g/b/a属性不属于Gadget类的直接字段,需要关闭Jackson的未知属性报错:
XmlMapper xmlMapper = new XmlMapper(); xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
原理说明
序列化时ColorSerializer将Color的RGBA值写入<gadget>节点的属性;反序列化时,ColorDeserializer从该节点属性中提取值构建Color实例,同时关闭未知属性校验,避免Jackson因找不到对应字段抛出异常。
内容的提问来源于stack exchange,提问作者Niclas Hedhman
相关产品推荐
相关产品推荐

