将json阵列键数据存储在单独的arrayLists

时间:2018-09-09 14:36:07

标签: android json

我有从url返回的这种json数据,如Image1 Image2 Image3中所示 基本上,数据中有日期,然后在这些日期之内还有5种不同的东西,即session_from,session_to,rate,bookingFound和Promotion。我想要的是我想将所有这些日期数据存储在单独的arraylist中。

例如:

sessionfrom0 包含2018年9月9日及其所有对象的数据

sessionfrom1 包含2018年10月9日的数据及其所有对象

sessionfrom2 包含2018年11月9日的数据及其所有对象

我尝试使用以下代码段,但无法正常运行

JSONObject jsonObject = new JSONObject(response);
JSONObject dataObj = jsonObject.getJSONObject("data");
Iterator<String> iter = dataObj.keys();

    sessionsfrom0 = new ArrayList<String>();
    sessionsfrom1 = new ArrayList<String>();
    sessionsfrom2 = new ArrayList<String>();
        while (iter.hasNext()) {
            key = iter.next();
            JSONArray datesArray = dataObj.getJSONArray(key);

            for (int i = 0; i < datesArray.length(); i++) {
                 JSONObject datesObject0 = datesArray.getJSONObject(i);
                 JSONObject datesObject1 = datesArray.getJSONObject(i);
                 JSONObject datesObject2 = datesArray.getJSONObject(i);

                 sessionsfrom0.add(datesObject0.getString("session_from") + " - " +datesObject0.getString("session_to");
                 sessionsfrom1.add(datesObject1.getString("session_from") + " - " +datesObject1.getString("session_to");
                 sessionsfrom2.add(datesObject2.getString("session_from") + " - " +datesObject2.getString("session_to");
                  } }

此代码无法正常工作,因为您可以看到日期2018年9月9日还包含其他大小为4的数组,并且在这些数组中,每个jjson对象中还有其他5个项目,因此我想将所有这些存储在第一个arraylist中即sessionfrom0,然后转到下一个日期,选择其所有数组和json对象,并将数据存储在sessionfrom1 arraylist中,等等。

3 个答案:

答案 0 :(得分:1)

尝试一下:

JSONObject jsonObject = new JSONObject(response);
JSONObject dataObj = jsonObject.getJSONObject("data");
Iterator<String> iter = dataObj.keys();

sessionsfrom0 = new ArrayList<String>();
sessionsfrom1 = new ArrayList<String>();
sessionsfrom2 = new ArrayList<String>();
    while (iter.hasNext()) {
        String key = iter.next();
        JSONArray datesArray = dataObj.getJSONArray(key);

        switch (key) {
           case "2018-09-09":
              fillSessions(datesArray, sessionsfrom0);
              break;

           case "2018-10-09":
              fillSessions(datesArray, sessionsfrom1);
              break;
           ....so on....
        }
    }

您可以创建一个函数,而不是在每种情况下都重写for循环逻辑:

void fillSessions(JSONArray jsonArray, List<String> sessionList) {
   for (int i = 0; i < jsonArray.length(); i++) {
      JSONObject datesObject = jsonArray.getJSONObject(i);

      sessionList.add(datesObject.getString("session_from") + " - " +datesObject0.getString("session_to");
   }
}

答案 1 :(得分:1)

您可以使用HashMap

JSONObject jsonObject = new JSONObject(response);
    JSONObject dataObj = jsonObject.getJSONObject("data");
    Iterator<String> iter = dataObj.keys();

    HashMap<String, ArrayList<String>> map = new HashMap<>();

    while (iter.hasNext()) {
        key = iter.next();

        JSONArray datesArray = dataObj.getJSONArray(key);
        ArrayList<String> list = new ArrayList<>();

        for (int i = 0; i < datesArray.length(); i++) {
            JSONObject datesObject0 = datesArray.getJSONObject(i);

            list.add(datesObject0.getString("session_from") + " - " + datesObject0.getString("session_to");
        }
        map.put(key, list);
        }

答案 2 :(得分:1)

尝试一下:

JSONObject jsonObject = new JSONObject(response);
JSONObject dataObj = jsonObject.getJSONObject("data");
Iterator<String> iter = dataObj.keys();

Map<String, ArrayList<String>> map = new TreeMap<>();
while (iter.hasNext()) {
    String key = iter.next();
    JSONArray datesArray = dataObj.getJSONArray(key);
    ArrayList<String> tmp = new ArrayList<>();
    for (int i = 0; i < jsonArray.length(); i++) {
        JSONObject datesObject = jsonArray.getJSONObject(i);
        tmp.add(datesObject.getString("session_from") + " - "+datesObject.getString("session_to"));
    }
    map.put(key, tmp);
}

可能您的数据中没有所有键,因此使用开关大小写不敏感。