我测试SnakeYAML库以读取.yaml文档。我看过例2.27。来自http://yaml.org/spec/1.1/的发票,我得到了对象:
System.out.println(content);
Yaml yaml = new Yaml();
Object o = yaml.load(content);
其中content是使用Files.readAllBytes从文件加载的String,encoding.decode(编码为StandardCharsets.UTF_8)
反射让我觉得o是java.util.LinkedHashMap的类型,我可以迭代它们:
Set entrySet = o.entrySet();
Iterator it = entrySet.iterator();
System.out.println("LinkedHashMap entries : ");
while (it.hasNext())
{
Object entry = it.next();
System.out.println(entry);
}
Reflection返回该类型的条目是LinkedHashMap $ Entry。但问题:内部类LinkedHashMap $ Entry是私有的,我无法声明此类型的对象。 我如何从entry,iterator或entrSet获得对?
答案 0 :(得分:5)
您应该声明Map.Entry
而不是LinkedHashMap.Entry
:
while (it.hasNext())
{
Map.Entry<?,?> entry = it.next();
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}
Map.Entry
是public interface
,LinkedHashMap.Entry
是该界面的私有实现。
请注意,我还使用Entry
声明了<?,?>
,这是generic declaration。如果您知道Map
的类型,则可以声明该类型,并且您不需要进行投射:
Set<Entry<?,?>> entrySet = o.entrySet();
Iterator<Entry<?,?>> it = entrySet.iterator();
此外,您可以使用增强的foreach循环来迭代:
final Map<?,?> myMap = (Map<?,?>) yaml.load(content);
for(final Entry<?,?> entry : o.entrySet()) {
//do stuff with entry
}
显然,如果您知道自己的Map
已将String
映射到Object
(例如),则可以使用Map<String, Object>
答案 1 :(得分:1)