【问题标题】:Yaml Parsing from a config file从配置文件中解析 Yaml
【发布时间】:2012-02-16 14:48:57
【问题描述】:

这是我第一次使用 YAML 解析器,目前我被困在这一点上

我有一个类似的配置文件

Users
 -Name:A
  Id : x
  Addr:10.0.0.1
 -Name:B
  Id  :y
  Addr:10.0.0.2

HomeAddress
 City:bla bla
 Country:bla bla

Office Address
 City:abchd
 Country:bha bha ba

所以我认为解析它的最好方法是有一个这样的列表。

List<Map<String, obj>> Object = (List<Map<String, obj>>) yaml.load(input);

目标是通过指定字符串来访问对象。和用户名 A 一样,我应该能够获得他的 id 和 IPAddr(这是目前对我来说最重要的)。但是当我尝试这个声明时,我得到了这样的错误

Exception in thread "main" java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to java.util.List
    at Message.MessagePasser.<init>(MessagePasser.java:34)

谁能帮我调试一下。我要赶截止日期了!!:(

【问题讨论】:

    标签: java parsing yaml classcastexception


    【解决方案1】:

    1) 在此处检查您的 YAML 的有效性:http://instantyaml.appspot.com/

    2) 您的文档应如下所示:(注意空格!)

    Users : 
     - Name : A
       Id : x
       Addr : 10.0.0.1
     - Name : B
       Id   : y
       Addr : 10.0.0.2
    

    【讨论】:

    • 您的验证器不再工作,这是另一个:yamllint.com。此外,良好的格式似乎删除了关键字之间的空格,':' 和 '-' 应该在一个空行上,属性来自 CR LF。
    【解决方案2】:

    YAML 解析器似乎返回了 Map。所以你应该像这样使用它:

    Map config = (Map) yaml.load(input);
    Map usersConfig = config.get("Users");
    

    您还使用什么特定的 YAML 解析器?

    更新 1:如果查看 documentationload 方法会返回 ListMap,具体取决于 YAML 文件的内容。由于您的 YAML 文件以键值映射 (Users) 而不是数组 (-) 开头,因此 load 方法返回一个 Map,这是在这种情况下返回的适当类型。

    【讨论】:

    • 我正在使用 SnakeYaml 解析器
    • 感谢您的澄清。根据您的提示,我将代码修改为Map&lt;String,nodeIP&gt; obj = (Map&lt;String,nodeIP&gt;) yaml.load(input); 之类的东西,但尽管如此,我还是有一个错误,说它不能将 java.util.ArrayList 转换为 NodeIP 类型(这是我定义的一个类)。那么您能建议对此进行一些更改吗?
    • @ExceptionHandler 查看this 测试用例(尤其是testLoadMap)及其随附的YAML file,看看它是如何工作的。简而言之,SnakeYaml 需要一些关于 JavaBeans 如何映射到 YAML 元素并返回的额外信息。
    • 您的 Update1 是一个绝妙的花絮。我只是花了一个小时试图弄清楚为什么在停止工作之前工作的代码......这是因为我无知地在我的 YAML 中放了一个东西:改变了负载的返回值类型!
    猜你喜欢
    • 1970-01-01
    • 2017-11-17
    • 2019-12-01
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    相关资源
    最近更新 更多