如何简化我的yaml结构以获得更好的java可读性



如果我有下面的yaml结构,我如何在java中高效地读取它?目前,我正在阅读

xmas-fifth-day:
calling-birds: 
value: four
partridges:
count: 1
value: "a pear tree"
turtle-doves: 
value: two

Yaml yaml = new Yaml();
InputStream inputStream = new FileInputStream(new File("src/main/resources/customer.yaml"));
Map<String, Object> data = yaml.load(inputStream);
LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, String>>> lhm = (LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, String>>>) data.get("xmas-fifth-day");

由于我使用了3个级别的hashmap,只是为了可读性,我想知道是否有这个yaml结构的简化版本可以在java中以较少嵌套的LHM方式读取?

EDIT:我不想在这里添加POJO,因为在我的用例中,配置是动态的,任何人都可以添加任何配置,代码应该在不编辑java类的情况下工作。

看起来您正在使用SnakeYAML,因此您可以定义自定义类型:

public class XmasFifthDay {
private CallingBirds callingBirds;
private Partridges partridges;
private TurtleDoves turtle-doves;
// getters and setters
}
public class CallingBirds {
private String value;
// getters and setters
}
// other classes: Partridges, TurtleDoves

然后加载:

XmasFifthDay data = yaml.load(inputStream);

也许CallingBirdsPartridgesTurtleDoves可以是具有countvalue字段的单个类,但您提供的示例不是很清楚。

在我看来,Jackson有更好的选择:

Yaml yaml = new Yaml();
InputStream inputStream = new FileInputStream(new File("test.yml"));
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
final JsonNode jsonNode = mapper.readValue(inputStream, JsonNode.class);
System.out.println(jsonNode.toPrettyString());

输出为:

{
"xmas-fifth-day" : {
"calling-birds" : {
"value" : "four"
},
"partridges" : {
"count" : 1,
"value" : "a pear tree"
},
"turtle-doves" : {
"value" : "two"
}
}
}
System.out.println(jsonNode.get("xmas-fifth-day"));
{"calling-birds":{"value":"four"},"partridges":{"count":1,"value":"a pear tree"},"turtle-doves":{"value":"two"}}

此外,您还可以使用TyperReference获得String和JsonNode的映射

inputStream = new FileInputStream(new File("test.yml"));
final Map<String,JsonNode>  map = mapper.readValue(inputStream, new TypeReference<Map<String, JsonNode>>() {});
System.out.println(map.get("xmas-fifth-day"));

输出为:

{"calling-birds":{"value":"four"},"partridges":{"count":1,"value":"a pear tree"},"turtle-doves":{"value":"two"}}

最新更新