使用SnakeYAML序列化Java Bean时,如何去除!!开头的标签前缀?
使用SnakeYAML序列化Java Bean时,如何去除!!开头的标签前缀?
嗨,这个问题我之前也碰到过!SnakeYAML默认输出的!!com.catalog.Being标签是它用来标记对象类型的方式,想要去掉其实只需要简单调整一下配置就行,我给你两种实用的解决方案:
方法一:将Bean映射为普通YAML映射(最直接)
如果你希望把Being类直接序列化为普通的YAML键值对(不需要类型标识),可以通过自定义Representer来实现。核心思路是告诉SnakeYAML,把Being对象当作普通的MAP类型处理,而不是需要标记类型的自定义对象。
代码示例如下:
import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.nodes.Tag; import org.yaml.snakeyaml.representer.Representer; import java.util.Arrays; import java.util.List; public class YamlSerializationExample { public static void main(String[] args) { // 配置输出风格为块级(和你示例中的格式一致) DumperOptions options = new DumperOptions(); options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); // 创建自定义Representer,注册Being类对应的标签为普通MAP Representer representer = new Representer(options); representer.addClassTag(Being.class, Tag.MAP); // 初始化YAML实例并序列化 Yaml yaml = new Yaml(representer, options); List<Being> beings = Arrays.asList( new Being("human", "john", "earth"), new Being("cat", "joanna", "earth") ); String yamlOutput = yaml.dump(beings); System.out.println(yamlOutput); } } // 你的Being类示例 class Being { private String type; private String name; private String origin; public Being(String type, String name, String origin) { this.type = type; this.name = name; this.origin = origin; } // 别忘了添加getter方法,SnakeYAML需要通过getter读取属性 public String getType() { return type; } public String getName() { return name; } public String getOrigin() { return origin; } }
运行这段代码后,输出的YAML就会变成你想要的样子:
- type: human name: john origin: earth - type: cat name: joanna origin: earth
方法二:全局禁用类型标签(适合多类场景)
如果你有多个不同的Java Bean都需要去掉类型标签,可以设置Representer的setDefaultTag方法,直接让所有序列化对象都按普通映射处理。不过要注意:如果后续需要将YAML反序列化回Java对象,这种方式会丢失类型信息,可能导致反序列化失败,所以只推荐在不需要反序列化的场景使用:
Representer representer = new Representer(options); // 全局设置默认标签为MAP,所有序列化对象都按普通映射处理 representer.setDefaultTag(Tag.MAP);
额外提醒
- 务必确保你的Bean类有对应的getter方法,SnakeYAML默认通过getter来读取对象属性;
- 如果后续需要反序列化,去掉类型标签后,你需要在反序列化时明确指定目标类型(比如通过
Constructor指定根类型),否则SnakeYAML无法识别映射对应的Java类。
备注:内容来源于stack exchange,提问作者Harold L. Brown
相关产品推荐
相关产品推荐

