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
相关产品推荐
相关产品推荐

