SnakeYAML写回YAML文件如何保留原字段顺序或类定义字段顺序
SnakeYAML写回YAML保留字段顺序解决方案
SnakeYAML默认对JavaBean序列化时会按字典序对字段排序,可通过配置保留自定义顺序,不需要更换库,具体实现方式如下:
方案1:保留Java类字段定义顺序
自定义PropertyUtils重写属性获取逻辑,指定字段输出顺序:
- 实现自定义属性工具类
import org.yaml.snakeyaml.introspector.BeanAccess; import org.yaml.snakeyaml.introspector.Property; import org.yaml.snakeyaml.introspector.PropertyUtils; import java.util.LinkedHashSet; import java.util.Set; public class OrderedPropertyUtils extends PropertyUtils { @Override protected Set<Property> getProperties(Class<?> type, BeanAccess bAccess) { Set<Property> defaultProps = super.getProperties(type, bAccess); // Template类使用自定义顺序,其他类保持默认逻辑 if (Template.class.isAssignableFrom(type)) { Set<Property> orderedProps = new LinkedHashSet<>(); // 按你需要的顺序添加字段 orderedProps.add(getProperty(type, "examPart")); orderedProps.add(getProperty(type, "name")); orderedProps.add(getProperty(type, "yxsj")); orderedProps.add(getProperty(type, "yxzd")); orderedProps.add(getProperty(type, "jypp")); // 补充未手动配置的其他字段 for (Property prop : defaultProps) { if (!orderedProps.contains(prop)) { orderedProps.add(prop); } } return orderedProps; } return defaultProps; } }
- 初始化SnakeYAML时绑定自定义配置
import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.constructor.Constructor; import org.yaml.snakeyaml.representer.Representer; // 配置输出格式为块级样式 DumperOptions options = new DumperOptions(); options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); // 绑定自定义属性工具类 Representer representer = new Representer(options); representer.setPropertyUtils(new OrderedPropertyUtils()); Constructor constructor = new Constructor(); constructor.setPropertyUtils(new OrderedPropertyUtils()); // 生成带自定义配置的Yaml实例 Yaml yaml = new Yaml(constructor, representer, options);
使用该实例做读写操作,输出的YAML就会按照指定的字段顺序排列。
方案2:保留原文件读取的字段顺序
如果不需要映射为JavaBean,直接用LinkedHashMap接收YAML内容即可,SnakeYAML会默认保留原文件的字段插入顺序,直接写回就不会发生顺序变化。
可选替代库
如果不想修改SnakeYAML配置,也可以使用以下库满足需求:
- jackson-dataformat-yaml:Jackson的YAML扩展模块,支持通过
@JsonPropertyOrder注解直接在Java类上指定字段序列化顺序,配置更简便 - SnakeYAML Engine:SnakeYAML官方新版本,内置保留Java类字段定义顺序的配置,无需自定义扩展
内容的提问来源于stack exchange,提问作者peterB
相关产品推荐
相关产品推荐

