RIGOサルミエント:
私は単に持っています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
。
さらなる解明:
私がやっていることは、私が返すAPI呼んでいるであるjson
私として保存応答をMap
。
ボヘミアン:
ここではいくつかのヘルパーメソッドは、5月のヘルプ物事はよりクリーンで読みやすいように見えるということです。
@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);
あなたはもっとファンキーな何かをしたい場合は、地図の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
}
あなたのJSONライブラリを使用して、このクラスにデシリアライズは、その後、あなたがすることができます(おそらくマップクラスのimplのためのファクトリメソッドでそれを提供する必要があります)チェーンにもっと自然に電話を:
String attrValue = map.getNode(id1).getNode(id2).getString(attrName);
ファンキーなオプションは、私は会社のためにやったことであり、それは御馳走を働いた:)