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

将含列表的XML反序列化为POJO时TOV字段为空的问题排查

问题解答

嘿,我来帮你搞定这两个问题!

1. TOV对象为null的解决方法

是的,你需要通过Jackson的XML注解来明确字段与XML节点的映射关系,尤其是当字段名和XML节点名的匹配存在大小写或命名风格差异时。

你的asset类里的TOV字段为null,核心原因是Jackson XML默认的映射规则无法正确识别XML中的<TOV>节点与POJO字段的关联。你需要给asset类的TOV字段添加@JacksonXmlProperty注解,指定对应的XML节点名;同时要确保项目已经引入了jackson-dataformat-xml依赖(Maven/Gradle均可)。

修改后的asset类示例(建议类名大写开头,符合Java规范):

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import lombok.Getter;
import lombok.Setter;

public class Asset {
    @Getter @Setter
    private String id;

    @Getter @Setter
    @JacksonXmlProperty(localName = "TOV") // 明确关联XML中的<TOV>节点
    private TOV tov;
}

2. 将credit和castCrew存入Java List是否可行?

完全可行!Jackson XML支持自动将多个同名的XML子节点收集到List中,但有一个关键细节需要注意:禁用Jackson的默认包装器。

因为你的XML里没有包裹所有<credit>/<castCrew>节点的父容器(比如<credits>或<castCrews>),所以需要给TOV类里的credit和castCrew字段添加@JacksonXmlElementWrapper(useWrapping = false)注解,告诉Jackson直接把同名子节点收集到List里,而不是去寻找不存在的包裹节点。

修改后的TOV类示例:

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import lombok.Getter;
import lombok.Setter;
import java.util.List;

public class TOV {
    @Getter @Setter
    private String episodeNumber;
    @Getter @Setter
    private String music;
    @Getter @Setter
    private String artist;

    @Getter @Setter
    @JacksonXmlElementWrapper(useWrapping = false) // 禁用默认包装器
    private List<Credit> credit; // 类名建议修正为大写开头的Credit

    @Getter @Setter
    @JacksonXmlElementWrapper(useWrapping = false) // 禁用默认包装器
    private List<CastCrew> castCrew; // 类名建议修正为大写开头的CastCrew
}

对应的子类也建议修正类名并确保字段映射正确:

import lombok.Getter;
import lombok.Setter;

public class Credit {
    @Getter @Setter
    private String biography;
}
import lombok.Getter;
import lombok.Setter;

public class CastCrew {
    @Getter @Setter
    private String role;
    @Getter @Setter
    private String name;
}

最后,记得使用XmlMapper而非普通ObjectMapper来解析XML:

import com.fasterxml.jackson.dataformat.xml.XmlMapper;

public class XmlParseDemo {
    public static void main(String[] args) throws Exception {
        String xmlContent = "<asset id=\"35465146\"> <TOV artist=\"\" music=\"0\" episodeNumber=\"\"> <credit biography=\"\" /> <credit biography=\"\" /> <credit biography=\"\" /> <credit biography=\"\" /> <castCrew role=\"Actor\" name=\"John C. Reilly\"/> <castCrew role=\"Director\" name=\"Keith Scholey\"/> <castCrew role=\"Director\" name=\"Alastair Fothergill\"/> <castCrew role=\"Director\" name=\"Adam Chapman\"/> </TOV> </asset>";
        
        XmlMapper xmlMapper = new XmlMapper();
        Asset asset = xmlMapper.readValue(xmlContent, Asset.class);
        
        // 此时asset.getTov()不再为null,credit和castCrew列表也会正确填充数据
    }
}

内容的提问来源于stack exchange,提问作者gabrriel_bu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:04:35