2012-01-23 101 views
2

这是我第一次使用YAML解析器和我目前停留在这一点上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) 

有人可以帮我调试这个。我限期运行!! :(

回答

3

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

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

还什么特别YAML解析器您使用

更新1:如果你看看documentation,该load方法要么返回一个ListMap取决于你的YAML文件的内容,当你的YAML文件,一键 - 值映射开始(Users)而不是数组(-),则load方法将返回Map,这是在此情况下要返回的适当类型。

+0

我使用的是SnakeYaml分析器 – ExceptionHandler

+0

请参阅!更新的答案。 – Behrang

+0

谢谢你的澄清。把你的小技巧修改为这个,我修改了我的代码,像'Map obj =(Map )yaml.load(input);'但是,尽管如此,我有一个错误,它不能将java.util.ArrayList强制转换为NodeIP类型(这是我定义的类)。所以你能提出一些改变吗? – ExceptionHandler

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 
+1

您的验证器不再工作,这是另一个:http://www.yamllint.com/。此外,良好的格式似乎删除关键字之间的空格,':'和' - '应该在一个空行上,属性出现在CR LF上。 – Alex