Я хочу знать, почему мой Arraylist ничего не отображает:
{"Friends":[{"name":"Java","age":"18"},{"name":"Python","age":"35"},{"name":"Denis","age":"45"}]}
MainActivity (появляется тост в catch
of OnPostExecute
под названием «CATCH OF THE TRY»):
package com.example.parsingjson;
import androidx.appcompat.app.AppCompatActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
public class MainActivity extends AppCompatActivity {
private ListView lv;
String Friends;
String namey, age;
private static String JSON_URL="https://run.mocky.io/v3/9c0d17c6-c9a4-41d9-89cc-ac43e44f2b88";
ArrayList<HashMap<String,String>> friendsList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
friendsList = new ArrayList<>();
lv = findViewById(R.id.listview);
GetData getData = new GetData();
getData.execute();
}
public class GetData extends AsyncTask<String, String, String>{
@Override
protected String doInBackground(String... strings) {
String current = "";
try {
URL url;
HttpURLConnection urlConnection = null;
try {
url = new URL(JSON_URL);
urlConnection = (HttpURLConnection) url.openConnection();
InputStream in = urlConnection.getInputStream();
InputStreamReader isr = new InputStreamReader(in);
int data = isr.read();
while (data != -1) {
current += (char) data;
data = isr.read();
}
return current;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return current;
}
@Override
protected void onPostExecute(String s) {
// Toast.makeText(getApplicationContext(), "POST EXECUTE", Toast.LENGTH_LONG).show();
try{
// Toast.makeText(getApplicationContext(), "TRY", Toast.LENGTH_LONG).show();
JSONObject jsonObject = new JSONObject(s);
JSONArray jsonArray = jsonObject.getJSONArray(Friends);
for (int i = 0; i< jsonArray.length() ; i++){
Toast.makeText(getApplicationContext(), "FOR", Toast.LENGTH_LONG).show();
JSONObject jsonObject1 = jsonArray.getJSONObject(i);
namey = jsonObject1.getString("name");
age = jsonObject1.getString("age");
//HashMap
HashMap<String, String> friends = new HashMap<>();
friends.put("name","namey");
friends.put("age","age");
friendsList.add(friends);
// Toast.makeText(getApplicationContext(), "OPERATION SUCCESSFUL", Toast.LENGTH_LONG).show();
}
// Toast.makeText(getApplicationContext(), "APRES FOR", Toast.LENGTH_LONG).show();
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), "CATCH OF THE TRY", Toast.LENGTH_LONG).show();
}
// Displaying the results
ListAdapter adapter = new SimpleAdapter(
MainActivity.this,
friendsList,
R.layout.row_layout,
new String[]{"name", "age"},
new int []{R.id.textView, R.id.textView2});
lv.setAdapter(adapter);
}
}
}
row_layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:fontFamily="sans-serif-black"
android:text="TextView"
android:textColor="#000000"
android:textSize="36sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="24dp"
android:text="TextView"
android:textSize="30sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
</androidx.constraintlayout.widget.ConstraintLayout>
Activity_Main.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ListView
android:id="@+id/listview"
android:layout_width="409dp"
android:layout_height="729dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Единственный тост, который я не могу показать, находится в for (int i = ...
. Отображается тост в catch
.
org.json.JSONException: No value for null
at org.json.JSONObject.get(JSONObject.java:399)
at org.json.JSONObject.getJSONArray(JSONObject.java:594)
at com.example.parsingjson.MainActivity$GetData.onPostExecute(MainActivity.java:107)
at com.example.parsingjson.MainActivity$GetData.onPostExecute(MainActivity.java:52)
at android.os.AsyncTask.finish(AsyncTask.java:755)
at android.os.AsyncTask.access$900(AsyncTask.java:192)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:772)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Если этот блок catch
работает, это означает, что что-то пошло не так в try
, где вы анализируете JSON. Посмотрите на трассировку стека для JSONException
в ваших журналах, она скажет вам, в чем проблема. (Добавьте его к своему ответу, если вам нужна помощь в его решении)
@cactustictacs я добавил строку logcat
@Tanishq Chawda Проблема в том, что в списке ничего не отображается. Я добавляю Toast в Catch of doInBackGroud, и Toast не появляется.
Это не трассировка стека для вашего JSONException
, это просто случайное ведение журнала. Запустите свое приложение, сделайте всплывающее всплывающее окно «поймать», затем перейдите к logcat (возможно, отфильтруйте по уровню журнала ошибок) и найдите трассировку стека. Проверьте метку времени, если вам нужно. Вам нужны строки, которые говорят JSONException
и Caused by
и т. д., и все такое. Просто отредактируйте свой вопрос, не публикуйте ответы!
@cactustictacs Я нашел эти строки и добавил в РЕДАКТИРОВАТЬ
@Chazzy Не включайте ответ на вопрос, пожалуйста (вместо этого опубликуйте как отдельный ответ).
Вот бит в вашей трассировке стека, который говорит, где что-то идет не так:
org.json.JSONException: No value for null
at org.json.JSONObject.get(JSONObject.java:399)
at org.json.JSONObject.getJSONArray(JSONObject.java:594)
at com.example.parsingjson.MainActivity$GetData.onPostExecute(MainActivity.java:107)
Итак, в строке 107 в MainActivity
в вашей функции onPostExecute
вы вызываете getJSONArray()
. Исключением является отсутствие значения для null, что означает, что вы передаете null этому вызову.
Я не знаю, какая именно строка 107, но я предполагаю, что это так:
JSONArray jsonArray = jsonObject.getJSONArray(Friends);
и если вы передаете туда null, то Friends
должно быть null. И из кода, который вы разместили, это правда - вы создаете переменную
// no value assigned - null by default
String Friends;
но тогда вы на самом деле нигде не назначаете String
. Я предполагаю, что вы хотели назначить ему ключ JSON
String Friends = "Friends";
Также имя переменной действительно должно быть friends
— только классы и интерфейсы должны начинаться с заглавной буквы. Просто облегчает рассказ о том, что происходит!
@ cactustictacs Благодаря вашему ответу я обнаружил, что забыл поставить имя Друг между "". Теперь новая проблема заключается в том, что я показываю 3 раза NAMEY и AGE вместо Java 18, Python 35 и Denis 45. У вас есть идеи?
@Chazzy, вы добавляете строку "namey"
на свою карту вместо ссылки на переменную namey
Вы правы, я написал Friends вместо "Friend" и "namey", "age" вместо namey и age. Большое спасибо
не могли бы вы уточнить, с какой именно проблемой вы столкнулись ?? хорошо, я хотел знать, что ваш вызов API успешен или нет, а также ответ хранится в вашей модели или нет ??