SnakeYAML неправильно сохраняет

Я работал над настройкой своей конфигурации для использования SnakeYAML. Я хочу, чтобы моя конфигурация выглядела так:

connection:
    bind-ip: 0.0.0.0
    plugin-port: 2011
    rtk-port: 2012
    passphrase: abcde12345
updates:
    auto-update: true
    channel: recommended
    build: -1

а вместо этого получается как

connection: {bind-ip: 0.0.0.0, connection.passphrase: abcde12345, connection.pluginPort: 2011,
  connection.rtkPort: 2012}
updates: {updates.auto-update: true, updates.channel: Recommended, updates.build: -1}

У меня есть LinkedHashMap, в который я сохраняю вот так:

private LinkedHashMap<String, Map> values;
public void set(String key, Map<String, Object> value) {
        values.put(key, value);
    }

И вот метод, который я использую для заполнения/загрузки конфигурации

private void init() {
        Map<String, Object> connection = new LinkedHashMap<String, Object>();

       if (exists("connection.bind-ip"))  {
            bindIp = (String) get("connection.bind-ip");
        }  else {
            connection.put("bind-ip", bindIp);
        }

        if (exists("connection.passphrase"))  {
            passphrase = (String) get("connection.passphrase");
        }  else {
            connection.put("connection.passphrase", passphrase);
        }

        if (exists("connection.pluginPort"))  {
            pluginPort = (Integer) get("connection.rtkPort");
        }  else {
            connection.put("connection.pluginPort", pluginPort);
        }

        if (exists("connection.rtkPort"))  {
            rtkPort = (Integer) get("connection.rtkPort");
        }  else {
            connection.put("connection.rtkPort", rtkPort);
        }

        if (!(connection.isEmpty())) {
            set("connection", connection);
        }

        Map<String, Object> updates = new LinkedHashMap<String, Object>();

        if (exists("updates.auto-update")) {
            autoUpdate = (Boolean) get("updates.auto-update");
        }  else {
            updates.put("updates.auto-update", autoUpdate);
        }

        if (exists("updates.channel")) {
            channel = (String) get("updates.channel");
        }  else {
            updates.put("updates.channel", channel);
        }

        if (exists("updates.build")) {
            build = (Integer) get("updates.build");
        }  else {
            updates.put("updates.build", build);
        }

        if (!(updates.isEmpty())) {
            set("updates", updates);
        }
    }

Любая помощь будет принята с благодарностью! Извините, что немного длинно


person Tips48    schedule 15.05.2013    source источник


Ответы (2)


Простой ответ. Когда вы создаете YAML, используйте DumperOptions и установите DumperOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK), а ваш набор. Не могу поверить, что я пропустил это :(

person Tips48    schedule 16.05.2013

As of org.yaml:snakeyaml:1.17:

DumperOptions options = new DumperOptions();
options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK)
new Yaml(options).dump(data, writer)

Просто интересно, почему это не по умолчанию.

person Pavel Vlasov    schedule 05.07.2017