我正在解析YAML文件
Props:
Prop1 : [10, 22, 20]
Prop2 : [20, 42, 60]
这给了我Map<String, Map<String, ArrayList<Integer>>>
我想Map<String, Map<String, Integer[]>>
我不想在读取文件的代码中转换List<Integer> to Integer[]
。我可以在YAML文件中更改某些内容吗?
答案 0 :(得分:1)
来自snakeyaml文档:
Default implementations of collections are:
- List: ArrayList
- Map: LinkedHashMap (the order is implicitly defined)
没有简单的方法可以改变它。只需在列表中调用toArray()
即可。
答案 1 :(得分:1)
与我的另一个答案相反,这个重点是更改YAML文件。但是,您还需要添加一些Java代码来告诉SnakeYaml如何加载您使用的标记。
您可以为YAML序列添加标签:
Props:
Prop1 : !intarr [10, 22, 20]
Prop2 : !intarr [20, 42, 60]
这需要在加载之前注册SnakeYaml:
public class MyConstructor extends Constructor {
public MyConstructor() {
this.yamlConstructors.put(new Tag("!intarr"),
new ConstructIntegerArray());
}
private class ConstructIntegerArray extends AbstractConstruct {
public Object construct(Node node) {
final List<Object> raw = constructSequence(node);
final Integer[] result = new Integer[raw.size()];
for(int i = 0; i < raw.size(); i++) {
result[i] = (Integer) raw.get(i);
}
return result;
}
}
}
你这样使用它:
Yaml yaml = new Yaml(new MyConstructor());
Map<String, Map<String, Integer[]>> content =
(Map<String, Map<String, Integer[]>>) yaml.load(myInput);
答案 2 :(得分:0)
如果YAML文件的布局稳定,您可以将其直接映射到Java类,该类定义内部属性的类型:
public class Props {
public Integer[] prop1;
public Integer[] prop2;
}
public class YamlFile {
public Props props;
}
然后,您可以像这样加载它:
final Yaml yaml = new Yaml(new Constructor(YamlFile.class));
final YamlFile content = (YamlFile) yaml.load(myInput);
// do something with content.props.prop1, which is an Integer[]
我为属性使用标准Java命名,这需要您将YAML文件中的键更改为小写:
props:
prop1 : [10, 22, 20]
prop2 : [20, 42, 60]
您也可以保留大写字母,但是您需要相应地重命名Java属性。