如何在java中读取YAML文件?

如何在java中读取YAML文件?,java,yaml,snakeyaml,Java,Yaml,Snakeyaml,我有这样的YAML文件 Product: ProductA: Suite: SuiteName_A: Environment_1: ["A","B","C"] Environment_2: ["X","Y","Z"] SuiteName_B: Environment_1: ["E","F&q

我有这样的YAML文件

Product:
 ProductA:
  Suite:
    SuiteName_A:
      Environment_1: ["A","B","C"]
      Environment_2: ["X","Y","Z"]
    SuiteName_B:
      Environment_1: ["E","F","G"]
      Environment_2: ["K","L","M"]
 ProductB:
  Suite:
    SuiteName_K:
      Environment_1: ["A1","B2","C3"]
      Environment_2: ["X1","Y1","Z1"]
编辑---- 我已经创建了几个类,正如我在一些阅读文章中读到的,这里是我想到的

环境类

    package Configuration;

import java.util.ArrayList;

public class Environment {
    private ArrayList<String> Environment_1;
    private ArrayList<String> Environment_2;

    public ArrayList<String> getEnvironment_1() {
        return Environment_1;
    }

    public void setEnvironment_1(ArrayList<String> Environment_1) {
        this.Environment_1 = Environment_1;
    }

    public ArrayList<String> getEnvironment_2() {
        return Environment_2;
    }

    public void setEnvironment_2(ArrayList<String> Environment_2) {
        this.Environment_1 = Environment_2;
    }
}
这会产生以下错误:

     Exception in thread "main" Cannot create property=Product for JavaBean=Configuration.Product@4c98385c
 in 'reader', line 1, column 1:
    Product:
    ^
Unable to find property 'Product' on class: Configuration.Product
 in 'reader', line 2, column 3:
      Check-in:
      ^

    at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.constructJavaBean2ndStep(Constructor.java:270)
    at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.construct(Constructor.java:149)
    at org.yaml.snakeyaml.constructor.Constructor$ConstructYamlObject.construct(Constructor.java:309)
    at org.yaml.snakeyaml.constructor.BaseConstructor.constructObjectNoCheck(BaseConstructor.java:216)
    at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:205)
    at org.yaml.snakeyaml.constructor.BaseConstructor.constructDocument(BaseConstructor.java:164)
    at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:148)
    at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:525)
    at org.yaml.snakeyaml.Yaml.loadAs(Yaml.java:519)
    at Configuration.DbClass.main(DbClass.java:17)
Caused by: org.yaml.snakeyaml.error.YAMLException: Unable to find property 'Product' on class: Configuration.Product
    at org.yaml.snakeyaml.introspector.PropertyUtils.getProperty(PropertyUtils.java:159)
    at org.yaml.snakeyaml.introspector.PropertyUtils.getProperty(PropertyUtils.java:148)
    at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.getProperty(Constructor.java:287)
    at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.constructJavaBean2ndStep(Constructor.java:208)
    ... 9 more
我想获得环境名称的列表,并将其存储在列表中。我知道使用jackson api。但我不知道如何将这些数据映射到类。 我正在使用servlet,在servlet中我希望有一个java方法来获取字符串列表。

有一个推荐的java库列表: ,及

其中应用最广泛的可能是SnakeYAML。Baeldung有一个非常容易理解的教程:

[编辑以寻址新代码,并在编辑操作中输出]:

您使用的格式和命名约定也有一些问题。在yaml文件中,任何列表周围都需要[括号],实例变量需要是camelCase,任何字符串都需要用引号括起来(包括字符串HashMap键):

您应该尝试在bean命名约定中匹配这一点。另外,您的第二个设置者需要设置环境_2而不是环境_1。下面是实体类的外观

环境

package Configuration;

import java.util.ArrayList;

public class Environment {
    private ArrayList<String> environment_1;
    private ArrayList<String> environment_2;

    public ArrayList<String> getEnvironment_1() {
        return environment_1;
    }

    public void setEnvironment_1(ArrayList<String> environment_1) {
        this.environment_1 = environment_1;
    }

    public ArrayList<String> getEnvironment_2() {
        return environment_2;
    }

    public void setEnvironment_2(ArrayList<String> environment_2) {
        this.environment_2 = environment_2;
    }
}
这是无效的YAML:

环境_1:“A”、“B”、“C”
你需要做什么

Environment_1:[“A”、“B”、“C”]
然后,设定者的名字就错了:

public ArrayList getEnvironment_1(){
返回环境_1;
}
公共void setINT(ArrayList环境_1){
this.Environment_1=Environment_1;
}
setter必须命名为
setEnvironment\u 1
。这是因为SnakeYAML通过其getter和setter访问私有字段

下一个问题是YAML中的名称以大写字母开头。SnakeYAML使用来发现属性,这将产生
environment\u 1
作为属性名称,而不是
environment\u 1
。您可以通过覆盖属性发现来解决此问题:

final PropertyUtils uppercaseUtils=new PropertyUtils(){
@凌驾

公共属性getProperty(类也许此链接可以帮助您:Hey@JeffSchenck尝试了该方法,但出现了错误。我已经编辑了该问题并包含了类文件…您可以查看一下吗…谢谢您Hi@KoushikJ我编辑了我的答案以解决您修改后的问题。Hey Jeff…谢谢您,它工作正常,结果如下所示{Product=ProductA{={“SuiteName_A”={environment_1=[“A”,“B”,“C”]}……}….}…现在使用给定的Productname、SuiteName和eVironment…我只想列出结果…你对此有什么想法吗…?没问题@KoushikJ。根据你的问题,我添加了访问数据结构的功能。
    package Configuration;

import org.yaml.snakeyaml.Yaml;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

public class DbClass {

    public static void main(String[] args) throws FileNotFoundException {
        Yaml yaml = new Yaml();
        InputStream inputStream = new FileInputStream("path");
        System.out.println(inputStream);
        Product product = yaml.loadAs(inputStream,Product.class);
        System.out.println(product.getProduct());
    }
}
     Exception in thread "main" Cannot create property=Product for JavaBean=Configuration.Product@4c98385c
 in 'reader', line 1, column 1:
    Product:
    ^
Unable to find property 'Product' on class: Configuration.Product
 in 'reader', line 2, column 3:
      Check-in:
      ^

    at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.constructJavaBean2ndStep(Constructor.java:270)
    at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.construct(Constructor.java:149)
    at org.yaml.snakeyaml.constructor.Constructor$ConstructYamlObject.construct(Constructor.java:309)
    at org.yaml.snakeyaml.constructor.BaseConstructor.constructObjectNoCheck(BaseConstructor.java:216)
    at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:205)
    at org.yaml.snakeyaml.constructor.BaseConstructor.constructDocument(BaseConstructor.java:164)
    at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:148)
    at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:525)
    at org.yaml.snakeyaml.Yaml.loadAs(Yaml.java:519)
    at Configuration.DbClass.main(DbClass.java:17)
Caused by: org.yaml.snakeyaml.error.YAMLException: Unable to find property 'Product' on class: Configuration.Product
    at org.yaml.snakeyaml.introspector.PropertyUtils.getProperty(PropertyUtils.java:159)
    at org.yaml.snakeyaml.introspector.PropertyUtils.getProperty(PropertyUtils.java:148)
    at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.getProperty(Constructor.java:287)
    at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.constructJavaBean2ndStep(Constructor.java:208)
    ... 9 more
products:
  "ProductA":
    suite:
      "SuiteName_A":
        environment_1: ["A","B","C"]
        environment_2: ["X","Y","Z"]
      "SuiteName_B":
        environment_1: ["E","F","G"]
        environment_2: ["K","L","M"]
  "ProductB":
    suite:
      "SuiteName_K":
        environment_1: ["A1","B2","C3"]
        environment_2: ["X1","Y1","Z1"]
package Configuration;

import java.util.ArrayList;

public class Environment {
    private ArrayList<String> environment_1;
    private ArrayList<String> environment_2;

    public ArrayList<String> getEnvironment_1() {
        return environment_1;
    }

    public void setEnvironment_1(ArrayList<String> environment_1) {
        this.environment_1 = environment_1;
    }

    public ArrayList<String> getEnvironment_2() {
        return environment_2;
    }

    public void setEnvironment_2(ArrayList<String> environment_2) {
        this.environment_2 = environment_2;
    }
}
package Configuration;

import java.util.HashMap;

public class SuiteName {
    private HashMap<String,Environment> suite;

    public HashMap<String, Environment> getSuite() {
        return suite;
    }

    public void setSuite(HashMap<String, Environment> suite) {
        suite = suite;
    }
}
package Configuration;

import java.util.HashMap;

public class Product {
    private HashMap<String, SuiteName> products;

    public HashMap<String, SuiteName> getProducts() {
        return products;
    }

    public void setProducts(HashMap<String, SuiteName> products) {
        this.products = products;
    }
}
package Configuration;

import org.yaml.snakeyaml.Yaml;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;

public class DbClass {

    public static void main(String[] args) throws FileNotFoundException {
        Yaml yaml = new Yaml();
        InputStream inputStream = new FileInputStream("path.yml");
        System.out.println(inputStream);

        HashMap yamlMap = yaml.load(inputStream);
        for (Object o : yamlMap.entrySet()) {
            System.out.println(o);
        }
        // Access HashMaps and ArrayList by key(s)
        HashMap products = (HashMap) yamlMap.get("products");
        HashMap product = (HashMap) products.get("ProductA");
        HashMap suite = (HashMap) product.get("suite");
        HashMap suiteName = (HashMap) suite.get("SuiteName_B");
        ArrayList environment = (ArrayList) suiteName.get("environment_1");
        System.out.println(environment);
    }
}