You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 10:55:08