如何使用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
相关产品推荐
相关产品推荐

