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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 16:53:05