我只是有一个Map
。但是它可以返回Map
,也可以返回Map
。最多可能有3到4个嵌套的Map
。因此,当我想访问嵌套值时,需要执行以下操作:
((Map)((Map)((Map)CacheMap.get("id")).get("id")).get("id")).get("id")
是否有一种更清洁的方法?
我使用Map
而不是将其映射到对象的原因是出于可维护性(例如,当有新字段时)。
注意:
Map<String, Object>
它必须为Object
,因为它并不总是返回Hashmap
。它可能返回String
或Long
。
进一步的说明:
我正在做的是调用一个返回json
响应的api,并将其另存为Map
。
答案 0 :(得分:1)
以下一些帮助程序方法可以使事情看起来更清晰,更易读:
@SuppressWarnings("unchecked")
public static Map<String, Object> getMap(Map<String, Object> map, String key) {
return (Map<String, Object>)map.get(key);
}
@SuppressWarnings("unchecked")
public static String getString(Map<String, Object> map, String key) {
return (String)map.get(key);
}
@SuppressWarnings("unchecked")
public static Integer geInteger(Map<String, Object> map, String key) {
return (Integer)map.get(key);
}
// you can add more methods for Date, Long, and any other types you know you'll get
但是您必须嵌套通话:
String attrValue = getString(getMap(getMap(map, id1), id2), attrName);
或者,如果您想要更时髦的东西,请将上述方法作为实例方法添加到地图展示中:
public class FunkyMap extends HashMap<String, Object> {
@SuppressWarnings("unchecked")
public FunkyMap getNode(String key) {
return (FunkyMap)get(key);
}
@SuppressWarnings("unchecked")
public String getString(String key) {
return (String)get(key);
}
@SuppressWarnings("unchecked")
public Integer geInteger(String key) {
return (Integer)get(key);
}
// you can add more methods for Date, Long, and any other types you know you'll get
}
使用json库反序列化到此类中(您可能必须为它提供map类impl的工厂方法),然后可以更自然地链接调用:
String attrValue = map.getNode(id1).getNode(id2).getString(attrName);
时髦的选择是我为一家公司所做的,并且很有效:)
答案 1 :(得分:1)
如果您不知道JSON树的深度,并且担心添加新字段时的可维护性,建议您不要在Map中反序列化整个树,而是使用低级解析器。
>例如,如果您的JSON如下所示:
<nav>
<div class='color-nav' id="navbar">
<a id='contact-link' href="#contact">Contact</a>
<a id="about-link" href="#about">About</a>
<a id='portfolio-link' href="#portfolio">Portfolio</a>
<a id='home-link' class="active" href="#home">Home</a>
</div>
</nav>
<section>
<div id='home-1' class="home main-section">
</div>
</section>
<section>
<div id="portfolio-1" class="portfolio main-section">
</div>
</section>
<section>
<div id="about-1" class='about main-section'>
</div>
</section>
<section>
<div id='contact-1' class='contact main-section'>
</div>
</section>
您可以使用Jackson编写类似的代码来获取ID:
{
"id": {
"id": {
"id": {
"id": 22.0
}
}
}
}