java - 如何使用 SnakeYaml 对 YAML 中的节点进行排序?
问题描述
我正在使用snakeyaml 将java 对象解析为YAML,并且snakeyaml 是按字母顺序排列的。
我想使用 java 对象中定义的节点顺序。
前任:
ClassB
String name;
String address;
String description;
ClassA classa;
This prints as
classb
address : ..
classa: ..
description: ..
name: ..
Expected Output
classb
name: ..
address : ..
description: ..
classa: ..
Code:
Representer representer = new Representer();
representer.getPropertyUtils().setSkipMissingProperties(true);
DumperOptions dumperOptions = new DumperOptions();
options.setDefaultFlowStyle(DumperOptions.FlowStype.BLOCK);
options.setPrettyFlow(true);
Yaml yaml = new Yaml (new Constructor(ClassC.class, representer, options)
如何在 YAML 中保留订单?
解决方案
排序顺序来自 PropertyUtils.createPropertySet,它使用的是 TreeSet。
我找到了一种方法来覆盖它扩展代表:
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.stream.Collectors;
import org.yaml.snakeyaml.introspector.*;
import org.yaml.snakeyaml.nodes.*;
import org.yaml.snakeyaml.representer.Representer;
public class CustomRepresenter extends Representer {
public CustomRepresenter() {
super();
PropertyUtils propUtil = new PropertyUtils() {
@Override
protected Set<Property> createPropertySet(Class<? extends Object> type, BeanAccess bAccess) {
return getPropertiesMap(type, bAccess).values().stream().sequential()
.filter(prop -> prop.isReadable() && (isAllowReadOnlyProperties() || prop.isWritable()))
.collect(Collectors.toCollection(LinkedHashSet::new));
}
};
setPropertyUtils(propUtil);
}
}
然后在您的代码中使用:
Representer representer = new CustomRepresenter();
推荐阅读
- wordpress - 考虑到带宽、并发连接等限制,开发具有大量用户群的应用程序后端的最佳策略?
- amazon-web-services - AWS:“eb deploy my-env”给出错误:ServiceError - 检测到 1 个验证错误..成员的长度必须小于或等于 100
- sql-server - 完全包含的数据库和 Azure SQL 单一数据库有什么区别
- xml - 如何从任何数据类型 BPEL 中获取数据?[xpath/xquery]
- javascript - 每个数组的元素被放入一个对象
- menu - 构建自定义 DNN 电子商务超级菜单并从单独的 ERP 数据库中恢复产品类别并将两者链接起来
- javascript - 将平面数组转换为分层数组
- mysql - 使用express js框架在node js中关闭mysql的理想连接
- javascript - Javascript中是否有将数字(带小数位)转换为单词的功能?
- django - Django:上传文件后,用户界面抛出“此字段为必填项”错误