gpt4 book ai didi

java - 如何使用 SnakeYaml 对 YAML 中的节点进行排序?

转载 作者:行者123 更新时间:2023-12-05 07:04:19 28 4
gpt4 key购买 nike

我正在使用 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。

我找到了一种方法来覆盖它并扩展 Representer:


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();

关于java - 如何使用 SnakeYaml 对 YAML 中的节点进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62956776/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com