使用文件前面读取的默认值反序列化java中的yaml

8ljdwjyq  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(506)

我有一个yaml文件,看起来像这样:

defaultSettings:
    a: 1
    b: foo
entries:
    - name: one
      settings:
          a: 2
    - name: two
      settings:
          b: bar
    - name: three

假设我有这些课程:

class Settings {
    public int a;
    public String b;
}

class Entry {
    public String name;
    public Settings settings;
}

class Config {
    public Settings defaultSettings;
    public List<Entry> entries;
}

关键是我想用 defaultSettings 在文件的顶部为单个条目中未指定的任何设置指定。所以,这些条目会像这样写出来:

- name: one
      settings:
          a: 2
          b: foo
    - name: two
      settings:
          a: 1
          b: bar
    - name: three
      settings:
          a: 1
          b: foo

有没有一个好的方法可以做到这一点(例如,与Jackson,snakeyaml等)?我对代码有完全的控制权,所以如果这能带来更好的处理方式,我可以进行修改。

nhhxz33t

nhhxz33t1#

最后我做了这个,很有效:

class Settings {
    public int a;
    public String b;

    // 0 arg constructor uses the static defaults via the copy constructor
    public Settings() {
        this(Config.defaultSettings);
    }

    // copy constructor
    public Settings(Settings other) {
        // other will be null when creating the default settings
        if(other == null) return;

        // rest of copy constructor
    }
}

class Entry {
    public String name;
    public Settings settings = Config.defaultSettings; // use default if not set separately
}

class Config {
    public static Settings defaultSettings; // this is static
    public List<Entry> entries;

    // this is a setter that actually sets the static member
    public void setDefaultSettings(Settings defaultSettings) {
        Config.defaultSettings = defaultSettings);
}

然后是Jackson:

ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
Configuration config = mapper.readValue(configFile, Config.class);

本质上,这设置了一个静态 Settings (假设 defaultSettings 在文件中首先发生)。在yaml中指定了部分设置块的情况下,将使用settings 0-arg构造函数创建 Config.defaultSettings 然后jackson用文件中指定的内容修改它。如果没有 settings 文件中有块 Entry , Config.defaultSettings 直接使用(通过中的字段初始化 Entry ). 不错,比编写自定义反序列化程序要好。
如果有人有更好的方法,我还是很感兴趣的。

相关问题