从YAML文件中获取Integer []而不是ArrayList <integer>

时间:2017-01-16 21:21:31

标签: java arrays arraylist yaml snakeyaml

我正在解析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文件中更改某些内容吗?

3 个答案:

答案 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属性。