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

SnakeYAML写入对象列表到YAML如何去除!!开头的类型标识行

问题原因

SnakeYAML默认会为自定义POJO类型添加全类名标签(!!开头的内容),用于反序列化时自动识别对象类型,你不需要这类标签的话,可以通过配置Representer禁用自定义类的标签输出。

解决步骤

修改你的saveYaml2方法,添加类型映射配置即可,修改后的代码如下:

public static boolean saveYaml2(Object data, String filePath) {
    final DumperOptions options = new DumperOptions();
    options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
    options.setPrettyFlow(true);
    
    // 新增:配置序列化规则,去掉自定义类标签
    Representer representer = new Representer(options);
    // 注册Dept类的类型描述,将其标记为普通映射类型,不输出类路径标签
    TypeDescription deptDesc = new TypeDescription(Dept.class);
    deptDesc.setTag(Tag.MAP);
    representer.addTypeDescription(deptDesc);
    // 配置列表类型为普通序列,避免输出!!map根标签
    representer.addTypeDescription(new TypeDescription(List.class, Tag.SEQ));

    Yaml yaml = new Yaml(representer, options);
    URL url = ClassLoader.getSystemResource(filePath);
    try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(url.getPath())))) {
        yaml.dump(data, writer);
        return true;
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }
}

通用适配方案

如果你需要处理多个自定义POJO类,不想逐个注册,可以重写Representer的标签获取逻辑,全局禁用自定义类的标签输出:

Representer representer = new Representer(options) {
    @Override
    protected Tag getTag(Class<?> clazz, Tag defaultTag) {
        // 只对自定义类做处理,JDK自带类保持原有标签逻辑
        if (clazz.getClassLoader() != null) {
            return Tag.MAP;
        }
        return super.getTag(clazz, defaultTag);
    }
};

修改后导出的YAML就会和原文件格式完全一致,不会再出现!!开头的类型标识。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:57:03