使用SnakeYAML Java将用户作为嵌套在块序列中的块映射添加到yml文件

Posted

技术标签:

【中文标题】使用SnakeYAML Java将用户作为嵌套在块序列中的块映射添加到yml文件【英文标题】:Adding user to yml file as Block mapping nested in a block sequence, using SnakeYAML Java 【发布时间】:2016-09-17 16:54:53 【问题描述】:

我正在使用 Elastic Search,我遇到了一个名为 ReadOnlyRest 的插件,用于身份验证。要设置这个插件,我们需要将用户添加到 Elastic search yml。

所以我搜索了如何使用 Java 将 "key : value" 对数据添加到 yml。碰到 SnakeYAML 来添加数据。

我可以从 Java 发送用户的数据。

Java 代码。

package com.test.elasticsearch;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml;


public class YAMLSample 

protected static Logger logger = Logger.getLogger(YAMLSample.class);

final String fileName = "/home/Installation/elasticsearch-2.3.1/config/elasticsearch.yml";

    public void writeToYML() throws IOException 
       logger.debug("Write to YML");

       Map<String, Object> data = new HashMap<String, Object>();
       data.put("name", "user5");
       data.put("type", "allow");
       data.put("auth_key", "user5:user5");
       data.put("kibana_access", "ro");
       data.put("indices", new String[]  ".kibana*", "abc", "def" );

       List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
       list.add(data);

       DumperOptions options = new DumperOptions();
       options.setIndent(5);

       Yaml yaml = new Yaml(options);
       FileWriter writer = new FileWriter(fileName, true);

       yaml.dump(list, writer);
       logger.debug("DONE!");

    

    public static void main(String[] args) throws IOException 
        // new YAMLSample().readYML();
        new YAMLSample().writeToYML();
    

上述代码的输出是:

 -     name: user5
       indices: [.kibana*, abc, def]
       kibana_access: ro
       type: allow
       auth_key: user5:user5

但是,预期的输出是:

    - name: user5
      indices: [.kibana*, abc, def]
      kibana_access: ro
      type: allow
      auth_key: user5:user5

“Hyphen-minus”应该只有一个空格,“Hyphen-minus”之前应该有4个空格。

我的意思是说我希望它显示为用户数组。除了“Hyphen-minus”之外,还有几个空格。

请帮助我找出解决方案。

【问题讨论】:

【参考方案1】:

我已经修改了您的代码并得到了预期的结果。下面是代码的样子:

public class YAMLSample 

  final String fileName = "/tmp/rest.yml";

  public void writeToYML() throws IOException 
    log( "Write to YML" );

    Map<String, Object> user = new HashMap<>();
    user.put( "name", "user5" );
    user.put( "type", "allow" );
    user.put( "auth_key", "user5:user5" );
    user.put( "kibana_access", "ro" );
    user.put( "indices", new String[]  ".kibana*", "abc", "def"  );

    Map<String, Object> user2 = new HashMap<>();
    user2.put("name", "user2");
    user2.put("type", "allow");
    user2.put("auth_key", "user2:user2");
    user2.put("kibana_access", "ro");
    user2.put("indices", new String[]  ".kibana*", "abc", "def" );

    List<Map<String, Object>> list = new ArrayList<>();
    list.add(user);
    list.add(user2);

    Map<String, List<Map<String, Object>>> config = new HashMap<>();
    config.put( "access_control_rules", list );

    DumperOptions options = new DumperOptions();
    options.setIndent( 6 );
    options.setIndicatorIndent( 4 );
    options.setDefaultFlowStyle(DumperOptions.FlowStyle.AUTO);

    Yaml yaml = new Yaml(options);
    FileWriter writer = new FileWriter(fileName, true);

    yaml.dump( config, writer );
    log( "DONE!" );
  

  public static void main(String[] args) throws IOException 
    new YAMLSample().writeToYML();
  

  public void log(String str) 
    System.out.println(str);
  

基本上我将这两个选项添加到您的 Dumperoptions.setIndicatorIndent(4); options.setDefaultFlowStyle(DumperOptions.FlowStyle.AUTO);

并从 5 更新到 6 options.setIndent(6);

【讨论】:

您好 Marcel Dias,感谢您的回复,一切正常。问题是我使用的是snake-yaml 1.16 maven依赖。在 1.17 版本中,您在 DumperOptions 类中有这个新方法。

以上是关于使用SnakeYAML Java将用户作为嵌套在块序列中的块映射添加到yml文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 snakeYaml 库访问 YAML 文件中的内部(嵌套)键值

使用 SnakeYaml 将 java 对象写入文件 - 使用 Yaml.dump() 时不会写出内部对象列表

包含对象列表的 SnakeYaml 反序列化类

Snakeyaml - 如何对流样式进行自定义控制

如何解决snakeyaml NoSuchMethodError:getStyle()

在 OSGi 下使用 SnakeYaml?