获取 Integer[] 而不是 ArrayList<Integer>来自 YAML 文件 [英] Get Integer[] instead of ArrayList&lt;Integer&gt; from YAML file

查看:45
本文介绍了获取 Integer[] 而不是 ArrayList<Integer>来自 YAML 文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在解析一个 YAML 文件

I am parsing a YAML file

Props:
  Prop1 : [10, 22, 20]
  Prop2 : [20, 42, 60]

这给了我 Map>>我想得到 Map>我不想转换 List到读取文件的代码中的 Integer[] .我可以更改 YAML 文件中的某些内容吗?

This gives me Map<String, Map<String, ArrayList<Integer>>> I would like to get Map<String, Map<String, Integer[]>> I do not want to convert List<Integer> to Integer[] in the code that reads the file. Can I change something in my YAML file?

推荐答案

与我的其他答案相反,这个答案侧重于更改 YAML 文件.但是,您还需要添加一些 Java 代码来告诉 SnakeYaml 如何加载您使用的标签.

In contrast to my other answer, this one focuses on changing the YAML file. However, you also need to add some Java code to tell SnakeYaml how to load the tag you use.

您可以向 YAML 序列添加标签:

You could add tags to the YAML sequences:

Props:
  Prop1 : !intarr [10, 22, 20]
  Prop2 : !intarr [20, 42, 60]

这个需要在加载前用SnakeYaml注册:

This need to be registered with SnakeYaml before loading:

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

这篇关于获取 Integer[] 而不是 ArrayList<Integer>来自 YAML 文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆