Как разобрать JSON, содержащий объект и массив JSON, без ключа?

#java #android #json #parsing

#java #Android #json #синтаксический анализ

Вопрос:

У меня есть ответ JSON, который я должен показать в activity. Проблема, с которой я сталкиваюсь, связана с массивом JSON, который присутствует в ответе. Я хочу проанализировать его и показать данные об активности, в ответ на массив «start_times» я хочу показывать только по одному данным за раз…

Это ответ JSON, который я получаю от сервера

 {
    "data": {
        "start_times": [
            [
                "08:00:00",
                "09:00:00"
            ],
            [
                "09:00:00",
                "10:00:00"
            ],
            [
                "10:00:00",
                "11:00:00"
            ]
        ],
        "mon": [
            {
                "subject__name": Electronics,
                "faculty__first_name": Manoj
            },
            {
                "subject__name": null,
                "faculty__first_name": null
            },
            {
                "subject__name": null,
                "faculty__first_name": null
            }
        ]
         }
}
 

Мой код:

   final StringRequest myStringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>()
  {

    @Override
    public void onResponse(String response)
    {
      Log.i(TAG, "Response-->"   response);
      System.out.println(response);
      try
      {
        JSONObject obj = new JSONObject(response);
        JSONObject obj2 = obj.getJSONObject("data");
        JSONArray timetable = obj2.getJSONArray("mon");

        JSONArray timeTableTime = obj2.getJSONArray("start_times");
        Log.d(TAG, "timeTableTime-->"   timeTableTime);

        Log.d(TAG, "TimetableLength-->"   timetable.length());
        for (int i = 0; i < timetable.length(); i  )
        {
          JSONObject heroObject = timetable.getJSONObject(i);

          mondayHero mon = new mondayHero(
              heroObject.getString("faculty__first_name"),
              heroObject.getString("subject__name"),
              heroObject.getString("faculty__first_name"),
              obj2.getJSONArray("start_times"));
          Log.d(TAG, "mon-->"   mon);
          mondayList.add(mon);

        }

        //creating custom adapter object
        mondayListViewAdaptor adapter = new mondayListViewAdaptor(mondayList, c.getApplicationContext());

        //adding the adapter to listview
        listView.setAdapter(adapter);

      }

    }
  }

 

Фактический результат =

 Subject : Electronics
Faculty : Manoj
Time : [["08:00:00","09:00:00"],
       ["09:00:00","10:00:00"],
       ["10:00:00","11:00:00"]]

Subject : null
Faculty : null
Time : [["08:00:00","09:00:00"],
       ["09:00:00","10:00:00"],
       ["10:00:00","11:00:00"]]

Subject : null
Faculty : null
Time : [["08:00:00","09:00:00"],
       ["09:00:00","10:00:00"],
       ["10:00:00","11:00:00"]]
 

Ожидаемый результат (я хочу) =

 Subject : Electronics
Faculty : Manoj
Time : 08:00:00-09:00:00

Subject : null
Faculty : null
Time : 09:00:00-10:00:00

Subject : null
Faculty : null
Time : 10:00:00-11:00:00
 

Есть идеи, как решить эту проблему??

Ответ №1:

Вот исправленный код. Используйте timeTableTime массив в вашем цикле for

 for (int i = 0; i < timetable.length(); i  ) {
    JSONObject heroObject = timetable.getJSONObject(i);
    JSONObject timeObject = timetableTime.getJSONObject(i);

    mondayHero mon = new mondayHero(
        heroObject.getString("faculty__first_name"),
        heroObject.getString("subject__name"),
        heroObject.getString("faculty__first_name"),
        timeObject);
    Log.d(TAG,"mon-->" mon);
    mondayList.add(mon);
}
 

Комментарии:

1. Это работает для меня, спасибо, теперь я понял идею. Но мой вывод отображается как время : [«08:00:00″,»09:00:00»] после использования String time = hero.getTime().toString(); есть идеи @Дипак Хилларе

2. Да, вам нужно будет разделить массив строк и соединить их с помощью - разделителя. Итак, вместо того, чтобы делать timetableTime.getJSONObject(i) , вы можете сделать timeTableTime.getJSONArray(i) , который вернет вам массив. И тогда вы можете использовать timeObject[0] - timeObject[1] для получения желаемого результата.

3. timeTableTime.getJSONArray(i).join("-");