2012-04-03 21 views
4

入れ子になったHashMapsを持つArrayListがあります。親のHashMapから値を取得するのは簡単ですが、入れ子になったHashMap(子)から値を取得しようとするとClassCastExceptionが返されます。これは、(前回の記事と同様に)どのように見えるかのサンプルです:入れ子になったHashMapをArrayListにキャストする方法

ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>(); 

HashMap<String, Object> parentHash = new HashMap<String, Object>(); 
HashMap<String, String> childHash = new HashMap<String, String>(); 

childHash.put("child_id", "id") 
childHash.put("name", "first last"); 
childHash.put("sex", "man"); 

parentHash.put("parent_id", "id"); 
parentHash.put("name", "first last"); 
parentHash.put("sex", "woman"); 

parentHash.put("children", childHash); 
data.add(parentHash); 

キャストするに、私は(悲しいことに、私はClassCastExceptionが取得)次のコードを使用します。

Map<String, String> fetchedChildData = (Map<String, String>) data.get(position).get("children"); 
showAlert("Test", "Ok", (String) fetchedChildData.get("child_id")); 

誰かが教えてもらえます私がここで間違っているのは何ですか?

Errorlist:

04-03 17:34:01.640: W/dalvikvm(26248): threadid=1: thread exiting with uncaught exception (group=0x4001e578) 
04-03 17:34:01.645: E/AndroidRuntime(26248): FATAL EXCEPTION: main 
04-03 17:34:01.645: E/AndroidRuntime(26248): java.lang.ClassCastException: java.util.ArrayList 
04-03 17:34:01.645: E/AndroidRuntime(26248): at com.on_d_mand.live_dashboard.EventListMenu$2.onItemClick(EventListMenu.java:265) 
04-03 17:34:01.645: E/AndroidRuntime(26248): at android.widget.AdapterView.performItemClick(AdapterView.java:284) 
04-03 17:34:01.645: E/AndroidRuntime(26248): at android.widget.ListView.performItemClick(ListView.java:3740) 
04-03 17:34:01.645: E/AndroidRuntime(26248): at android.widget.AbsListView$PerformClick.run(AbsListView.java:1992) 
04-03 17:34:01.645: E/AndroidRuntime(26248): at android.os.Handler.handleCallback(Handler.java:587) 
04-03 17:34:01.645: E/AndroidRuntime(26248): at android.os.Handler.dispatchMessage(Handler.java:92) 
04-03 17:34:01.645: E/AndroidRuntime(26248): at android.os.Looper.loop(Looper.java:130) 
04-03 17:34:01.645: E/AndroidRuntime(26248): at android.app.ActivityThread.main(ActivityThread.java:3691) 
04-03 17:34:01.645: E/AndroidRuntime(26248): at java.lang.reflect.Method.invokeNative(Native Method) 
04-03 17:34:01.645: E/AndroidRuntime(26248): at java.lang.reflect.Method.invoke(Method.java:507) 
04-03 17:34:01.645: E/AndroidRuntime(26248): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912) 
04-03 17:34:01.645: E/AndroidRuntime(26248): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:670) 
04-03 17:34:01.645: E/AndroidRuntime(26248): at dalvik.system.NativeStart.main(Native Method) 
+1

私はあなたが(ポジション)を取得する必要はないと思います。これを試して。 Map fetchedChildData =(Map )parentContainer.get( "children"); – kosa

+3

parentContainerとは何ですか?あなたはそれを定義してどのように埋めるのかを示すことができますか? – assylias

+1

'parentContainer'は' data'と同じですか?説明してください。 – darrengorman

答えて

3

JSONオブジェクトとして表現されている "マップ" または "dictionnaryは、" あなたはJavaで均等にそれを表現しなければならないという意味ではありません。オブジェクトはこの目的のためにあります!

私は、関連するJSONを解析し、それからそれ自身を構築するオブジェクトがあることをお勧めします。例えば:

クラスがうまくなどのJSONを読んでいました
public class User { 

    public User() { 
    name = ""; 
    friends = new ArrayList<User>(); 
    } 

    /** Create a User from a JSON Object **/ 
    public static User createFromJson(JSONObject json) { 
    User u = new User(); 

    // Read simple fields of the JSON object 
    u.name = json.optString("name"); 

    // Now recursively read other users from a "friend" property 
    JSONArray jsonFriends = json.optJSONArray("friends"); 
    for (int i=0; i<jsonFriends.length(); ++i) { 
     // This is the next nested JSON Object 
     JSONObject jsonFriend = jsonFriends.getJSONObject(i); 

     // We convert it to a Java object 
     User friend = User.createFromJson(jsonFriend); 

     // And add it to our friend list 
     u.friends.add(friend); 
    } 
    } 

    private String name; 
    private List<User> friends; 
} 

:これは動作するはず

{ 
    "name": "Joe", 
    "friends": [ 
    { 
     "name": "Jack" 
    }, 
    { 
     "name": "Rose" 
    } 
    ] 
} 
+0

あなたの努力をありがとう、私は自宅にいるときにそれを試してみると、それが動作するときに正しいことをマークします。 – Xarialon

1

int position = 0; 
Map<String, Object> parent = data.get(position); 
Map<String, String> child = (Map<String, String>) parent.get("children"); 
+0

いいえ、それは同じコードです。それは動作しません。 – Xarialon

+0

あなたはおそらくあなたの質問で次のように修正するべきです: 'parentHash.get(position)'から 'data.get(position)' –

+0

おっと、申し訳ありません。私はデータを意味しました。しかし、問題は、それがまだ動作しないことです... – Xarialon

2

あなたのコードは、たぶんそれはのJava 6の上に私のために正常に動作しますAndroid Dalvikのバグ?

とにかく、コレクション内のコレクション内でコレクションを使用するのではなく、独自のクラス(「親」、「子」など)を作成し、composite design patternを使用することを検討してください。

ArrayList<HashMap<String,Object>> data = new ArrayList<HashMap<String,Object>>(); 
HashMap<String, Object> parentHash = new HashMap<String, Object>(); 
HashMap<String, String> childHash = new HashMap<String, String>(); 

childHash.put("child_id", "id"); 
childHash.put("name", "first last"); 
childHash.put("sex", "man"); 

parentHash.put("parent_id", "id"); 
parentHash.put("name", "first last"); 
parentHash.put("sex", "woman"); 

parentHash.put("children", childHash); 
data.add(parentHash); 

Map<String, String> fetchedChildData = 
    (Map<String, String>) data.get(0).get("children"); 

// prints: child_id=id 
System.out.println("child_id=" + fetchedChildData.get("child_id")); 
+0

私は愚かな間違いをしました。しかし、それは働いた!どうもありがとうございました! – Xarialon

関連する問題