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

如何使用SnakeYAML将类属性序列化为小写YAML(无需注解/Jackson)

实现方案

你只需要自定义PropertyUtils重写属性名映射规则,再绑定到SnakeYAML实例即可,该方案对所有类通用,无需加注解也无需适配单个类。

步骤1:自定义小写映射的PropertyUtils

继承SnakeYAML自带的PropertyUtils,重写getPropertyName方法,将返回的属性名统一转为小写:

import org.yaml.snakeyaml.introspector.Property;
import org.yaml.snakeyaml.introspector.PropertyUtils;

public class LowerCasePropertyUtils extends PropertyUtils {
    @Override
    public String getPropertyName(Property property) {
        return super.getPropertyName(property).toLowerCase();
    }
}

步骤2:配置SnakeYAML实例使用自定义规则

创建YAML实例时绑定上面的自定义PropertyUtils,如果需要直接读取私有字段,额外配置字段访问权限即可:

import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.introspector.BeanAccess;

public class LowerCaseYamlDemo {
    public static void main(String[] args) {
        Foo foo = new Foo();
        // 可选:配置序列化格式
        DumperOptions options = new DumperOptions();
        options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);

        Yaml yaml = new Yaml(options);
        // 绑定自定义属性映射规则
        yaml.setPropertyUtils(new LowerCasePropertyUtils());
        // 配置直接访问类的字段(不需要写public getter也能序列化私有属性)
        yaml.getPropertyUtils().setBeanAccess(BeanAccess.FIELD);

        // 执行序列化输出
        String result = yaml.dump(foo);
        System.out.println(result);
    }
}

输出结果

执行后输出完全符合预期:

firstname: John
lastname: Doe

补充说明

  • 该方案全局通用,所有类使用这个配置好的YAML实例序列化,都会自动输出全小写属性名。
  • 如果不需要直接访问私有字段,保留默认的BeanAccess.DEFAULT即可,会自动将getter对应的属性名转为小写,效果一致。
  • 你提到的解析带横杠字段的实现思路完全相同,都是通过重写getPropertyName方法自定义属性名映射规则,序列化和反序列化可以共用同一份规则保证一致性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 21:54:03