How to deal with nested static casting?

Rigo Sarmiento :

I simply have a Map. But it can return a Map, which may also return a Map. It's possible up to 3 to 4 nested Maps. So when I want to access a nested value, I need to do this:

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

Is there a cleaner way to do this?

The reason I'm using a Map instead of mapping it to an object is for maintainability (e.g. when there are new fields).

Note:

Map<String, Object>

It has to be Object because it won't always return a Hashmap. It may return a String or a Long.

Further clarification:

What I'm doing is I'm calling an api which returns a json response which I save as a Map.

Bohemian :

Here's some helper methods that may help things seem cleaner and more readable:

@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

But you would have to nest the calls:

String attrValue = getString(getMap(getMap(map, id1), id2), attrName);

Or, if you want something more funky, add the above methods as instance methods to a map impl:

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
}

Deserialize into this class with your json library (you'll probably have to provide it with a factory method for the map class impl), then you can chain the calls more naturally:

String attrValue = map.getNode(id1).getNode(id2).getString(attrName);

The funky option is what I did for a company, and it worked a treat :)

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=134043&siteId=1