如何用JacksonXML解析<!-- -->型XML注释并反序列化为Java POJO?
如何用jackson-databind-xml处理XML注释并反序列化为POJO
目前尝试解析XML中的<!-- -->注释并映射到Java对象,已编写POC,但自定义反序列化器无法识别XML注释,仅能正常解析字段值。若将注释改为//风格,JsonParser可通过ALLOW_COMMENTS特性识别,但原生XML注释无法被处理,希望找到解决方案。
XML模型示例
<Model> <!-- ** some comment here --> <Value1>foo</Value1> <!-- ** another comment here --> <Value2>bar</Value2> </Model>
Java模型定义
@JacksonXmlRootElement(localName= "Model") @JsonDeserialize(using = CustomDeserializer.class) final class ModelFile { @JacksonXmlProperty(localName = "value1") private String value1; @JacksonXmlProperty(localName = "value2") private String value2; private List<String> comments; // Getters and Setters }
自定义反序列化器(处理注释的分支未生效)
public class CustomDeserializer extends JsonDeserializer<ModelFile> { @Override public ModelFile deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { List<String> comments = new ArrayList<>(); ModelFile sample = new ModelFile(); while (p.nextToken() != JsonToken.END_OBJECT) { if (p.getCurrentToken() == JsonToken.FIELD_NAME) { String fieldName = p.getCurrentName(); p.nextToken(); if (fieldName.equals("value1")) { sample.setValue1(p.getText()); } else if (fieldName.equals("value2")){ sample.setValue2(p.getText()); } } else if (p.getText().equals("<!--")) { p.nextToken(); comments.add(p.getText()); p.nextToken(); } } sample.setComments(comments); return sample; } }
测试代码
@Test public void testDeserializeWithCommentsAsList() throws Exception { String xml = "<model>\n" + " <!--\n" + " this is a comment \n" + " -->\n" + " <value1>foo</value1>\n" + " <!--\n" + " Another comment \n" + " -->\n" + " <value2>bar</value2>\n" + "</model>"; XmlMapper xmlMapper = new XmlMapper(); ModelFile model = xmlMapper.readValue(xml, ModelFile.class); List<String> comments = model.getComments(); assertNotNull(comments); assertEquals(2, comments.size()); assertEquals("this is a comment", comments.get(0)); assertEquals("Another comment", comments.get(1)); }
问题核心
自定义反序列化器可正常解析value1和value2字段,但无法捕获XML的<!-- -->注释。推测因Jackson XML底层基于JSON(JSON不支持注释),原生不处理XML注释,但//风格注释可通过JsonParser的ALLOW_COMMENTS特性生效。现寻求如何处理<!-- -->类型的XML注释并反序列化为POJO的思路或方案。
内容的提问来源于stack exchange,提问作者gunavata
相关产品推荐
相关产品推荐

