如何处理嵌套的静态铸造?

时间:2018-11-25 23:37:47

标签: java casting hashmap

我只是有一个Map。但是它可以返回Map,也可以返回Map。最多可能有3到4个嵌套的Map。因此,当我想访问嵌套值时,需要执行以下操作:

((Map)((Map)((Map)CacheMap.get("id")).get("id")).get("id")).get("id")

是否有一种更清洁的方法?

我使用Map而不是将其映射到对象的原因是出于可维护性(例如,当有新字段时)。

注意:

Map<String, Object>

它必须为Object,因为它并不总是返回Hashmap。它可能返回StringLong

进一步的说明:

我正在做的是调用一个返回json响应的api,并将其另存为Map

2 个答案:

答案 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
             }
         }
     }
}