Как вы можете разыграть вложенный HashMap в ArrayList - PullRequest
4 голосов
/ 03 апреля 2012

Существует ArrayList, который имеет вложенные HashMaps. Получить значение из родительского HashMap легко, но когда я пытаюсь получить значение из вложенного HashMap (child), я получаю ClassCastException. Вот пример того, как это выглядит (похоже на предыдущий пост):

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)

Ответы [ 3 ]

3 голосов
/ 03 апреля 2012

Объекты JSON, представленные в виде «карты» или «словаря», не означают, что вы должны одинаково представлять их в Java.Для этой цели существуют объекты!

Я предлагаю вам иметь объект, который будет анализировать связанный 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;
}

Этот класс будет хорошо читать JSON, например:

{ 
  "name": "Joe",
  "friends": [
    {
      "name": "Jack"
    },
    {
      "name": "Rose"
    }
  ]
}
2 голосов
/ 03 апреля 2012

Ваш код отлично работает для меня на Java 6. Может быть, это ошибка в Android Dalvik?

В любом случае, я согласен, вы должны подумать о создании собственных классов ("Parent", "Child" и т. Д.) Ииспользование составного шаблона проектирования вместо использования коллекций в коллекциях внутри коллекций.

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"));
1 голос
/ 03 апреля 2012

Это должно работать:

int position = 0;
Map<String, Object> parent = data.get(position);
Map<String, String> child = (Map<String, String>) parent.get("children");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...