Данные JSON читаются, но не могут быть преобразованы в JSONArray
Я разрабатываю приложение, которое читает данные JSON. Данные Json анализируются, но не отображаются в списке. Logcat говорит о несоответствии типов. Я не очень знаком в Джсоне.
http://api.openweathermap.org/data/2.5/forecast/daily?lat=6.421465&lon=81.332396&cnt=10&mode=json
Это мой логкат и код. Пожалуйста, поделите меня с этим.
org.json.JSONException: индекс 1 находится вне диапазона [0..1) org.json.JSONArray.get(JSONArray.java:263) org.json.JSONArray.getString(JSONArray.java:421) com.is.parsej.ParseJ$GetContacts.doInBackground(ParseJ.java:141) com.is.parsej.ParseJ$GetContacts.doInBackground(ParseJ.java:1) android.os.AsyncTask$2.call(AsyncTask.java:287) java.util.concurrent.FutureTask.run(FutureTask.java:234) android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.j)
public class ParseJ extends ListActivity {
private ProgressDialog pDialog;
// URL to get contacts JSON
private static String url = "http://api.openweathermap.org/data/2.5/forecast/daily?lat=6.421465&lon=81.332396&cnt=10&mode=json";
// JSON Node names
private static final String TAG_COd = "list"; //edited
private static final String TAG_ID = "dt"; //edited
private static final String TAG_WEATHER = "weather";
private static final String TAG_MAIN = "main";
private static final String TAG_DESC = "description";
private static final String TAG_TEMP = "temp";
private static final String TAG_DAY = "day";
private static final String TAG_MIN = "min";
private static final String TAG_MAX = "max";
private static final String TAG_NIGHT = "night";
private static final String TAG_MORN= "morn";
private static final String TAG_HUMIDITY = "humidity";
// contacts JSONArray
JSONArray contacts = null;
// Hashmap for ListView
ArrayList<HashMap<String, String>> contactList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_parse_j);
contactList = new ArrayList<HashMap<String, String>>();
ListView lv = getListView();
// Listview on item click listener
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// getting values from selected ListItem
String weather = ((TextView) view.findViewById(R.id.main))
.getText().toString();
String Temp = ((TextView) view.findViewById(R.id.Descrption))
.getText().toString();
String Humidity = ((TextView) view.findViewById(R.id.temp))
.getText().toString();
// Starting single contact activity
Intent in = new Intent(getApplicationContext(),
SingleContactActivity.class);
in.putExtra(TAG_WEATHER, weather);
in.putExtra(TAG_TEMP, Temp);
in.putExtra(TAG_HUMIDITY, Humidity);
startActivity(in);
}
});
// Calling async task to get json
new GetContacts().execute();
}
/**
* Async task class to get json by making HTTP call
* */
private class GetContacts extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// Showing progress dialog
pDialog = new ProgressDialog(ParseJ.this);
pDialog.setMessage("Please wait...");
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected Void doInBackground(Void... arg0) {
// Creating service handler class instance
ServiceHandler sh = new ServiceHandler();
// Making a request to url and getting response
String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET);
Log.d("Response: ", "> " + jsonStr);
if (jsonStr != null) {
try {
JSONObject jsonObj = new JSONObject(jsonStr);
// Getting JSON Array node
contacts = jsonObj.getJSONArray(TAG_COd);
// looping through All Contacts
for (int i = 0; i < contacts.length(); i++) {
JSONObject c = contacts.getJSONObject(i);
String id = c.getString(TAG_ID);
String humidity = c.getString(TAG_HUMIDITY);
// Phone node is JSON Object
JSONObject temp = c.getJSONObject(TAG_TEMP);
String day = temp.getString(TAG_DAY);
String maxTemp = temp.getString(TAG_MAX);
String minTemp = temp.getString(TAG_MIN);
String morningTemp = temp.getString(TAG_MORN);
//edited
JSONArray weather = c.getJSONArray(TAG_WEATHER);
String main = weather.getString(1);
String desc = weather.getString(2);
// tmp hashmap for single contact
HashMap<String, String> contact = new HashMap<String, String>();
// adding each child node to HashMap key => value
contact.put(TAG_ID, id);
contact.put(TAG_DAY, day);
contact.put(TAG_DESC, desc);
contact.put(TAG_HUMIDITY, humidity);
// adding contact to contact list
contactList.add(contact);
}
} catch (JSONException e) {
e.printStackTrace();
}
} else {
Log.e("ServiceHandler", "Couldn't get any data from the url");
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
// Dismiss the progress dialog
if (pDialog.isShowing())
pDialog.dismiss();
/**
* Updating parsed JSON data into ListView
* */
ListAdapter adapter = new SimpleAdapter(
ParseJ.this, contactList,
R.layout.list_item, new String[] { TAG_DAY, TAG_DESC,
TAG_HUMIDITY }, new int[] { R.id.temp,
R.id.main, R.id.Descrption });
setListAdapter(adapter);
}
}
}
4 ответа
Основываясь на вашем JSON
это просто список элементов. Массивы имеют [
в начале и ]
в конце. Посмотрите внимательно на свой JSON, вы можете найти там некоторые элементы массива, которые имеют []
,
погода имеет только 1 элемент
"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04d"}]
Индекс вне границ, потому что вы используете
JSONArray weather = c.getJSONArray(TAG_WEATHER);
String main = weather.getString(1);
String desc = weather.getString(2);
где в вашем массиве json нет 1 и 2, так как в погоде, кажется, только один элемент помещает его в другой объект json
JSONObject weather = c.getJSONArray(TAG_WEATHER).getJSONObject(0);
String main = weather.getString("main");
String desc = weather.getString("description");
JSON здесь
{"cod": "200", "message": 0.2809, "city": {"id": 1244926, "name": "Hambantota", "ord":{"lon":81.1185,"lat":6.1241},"страна":"LK","население": 0}, "CNT": 10, "список":[{"дт": 1409896800, "темп": { "день": 301,95, "мин": 300,47, "макс": 302,12, "ночь": 301,31, "накануне": 301,87, "дорогою": 300,47}, "давление": 1020,63, "влажность": 88, "погода":[{"ID":803,"main":"Clouds","description":"Clouds Cloud","icon":"04d"}],"speed": 6.47,"deg":243,"clouds": 56}, {"dt ": 1409983200," температура ": {" день ": 301,11," мин ": 299,62," макс ": 301,29," ночь ": 299,62," накануне ": 300,76," дорогою ": 300,13}," давление ": 1021.53, "влажность": 92, "погода":[{"id":802,"main":"Clouds","description":"рассеянные облака","icon":"03d"}],"speed": 6,66, "град": 249, "облака": 48}, { "DT": 1410069600, "температура": { "день": 300,9, "мин": 299,36, "макс": 300,9, "ночь": 299,58, "накануне": 300,2, "дорогою": 299,36}, "давление": 1022,25, "влажность": 90, "погода":[{"ID": 803, "основные": "Облака", "описание": "облачность", "значок": "04d"}], "скорость": 7.21, "град": 242, "облака": 80}, {"dt": 1410156000, "temp": {"день": 299,47, "мин": 298,71, "макс": 300,44, "НИГ ХТ ": 299,5," Накануне ": 299.96," дорогою ": 298,71}," Давление ": 1023,27," влажность ": 98," погода ": [{" ID ": 802," основные ":" Облака", "description": "рассеянные облака","icon":"03d"}],"speed": 5.83,"deg":252,"clouds": 44}, {"dt": 1410242400, "temp": { "день": 301,38, "мин": 297,39, "макс": 301,38, "ночь": 298,36, "накануне": 300,82, "дорогою": 297,39}, "давление": 1012,02, "влажность": 0," погода ":[{"id":500,"main":"Rain","description":"light rain","icon":"10d"}],"speed": 3.87," deg ": 250, "облака": 76, "дождь": 0.38}, { "дт": 1410328800, "температура": { "день": 301,77, "мин": 297,49, "макс": 301,77, "ночь": 299,44," накануне ": 301,13," дорогою ": 297,49}," давление ": 1011,84," влажность ": 0," погода ": [{" ID ": 500," главный ":" дождь " "описание":" свет дождь", "значок": "10d"}], "скорость": 4,88, "град": 259, "облака": 27, "дождь": 0.82}, { "дт": 1410415200, "темп": { "день": 302,15, "мин": 299,15, "макс": 302,15, "ночь": 299,43, "накануне": 300,52, "дорогою": 299,15}, "давление": 1011,1, "влажность": 0," погода ":[{"id":500,"main":"Rain","description":"light rain","icon":"10d"}],"speed": 6.3," deg ": 257, "облака": 64, "дождь": 1.82}, { "дт": 1410501600," Темп ": {" день ": 301,52," мин ": 299,16," Макс ": 301,52," ночь ": 299,36," Накануне ": 300,59," дорогою ": 299,16}," Давление ": 1011,05," влажность": 0, "погода": [{"id": 500, "main": "Rain", "description": "light rain", "icon": "10d"}], "speed": 8.05, "deg ": 257," облака ": 50," дождь ": 2.38}, {" дт ": 1410588000," температура ": {" день ": 301,26," мин ": 298,74," макс ": 301,26," ночь": 299,53, "накануне": 300,43, "дорогою": 298,74}, "давление": 1010,43, "влажность": 0, "погода":[{"ID": 500, "главный": "дождь", "описание ":" легкий дождь "," значок ":" 10d "}]," скорость ": 7,69," градус ": 258," облака ": 33," дождь ": 1,34}, {" dt ": 1410674400," темп ": {" день ": 300.01," мин ": 298,37," макс ": 300.01," ночь ": 298,48," накануне ": 298,37," дорогою ": 298,87}," давление ": 1010,17," влажность": 0, "погода": [{"id": 501, "main": "дождь", "description": "умеренный дождь", "icon": "10d"}], "скорость": 8.36, "deg ": 253," облако ": 55," дождь ": 8.91}
и тогда вы получите объект с тегом "треска"
contacts = jsonObj.getJSONArray(TAG_COd)
"Треск": "200"
вы получите "200"
Как можно преобразовать "200" в JSONArray? структура массива такая же [{"dt":1409896800},{"dt":1409896800},{"dt":1409896800},{"dt":1409896800}]
начинается с "[" и заканчивается "]"
JSONObject jsonObj = new JSONObject(jsonStr);
// Getting JSON Array node
contacts = jsonObj.getJSONArray("list");
// looping through All Contacts
for (int i = 0; i < contacts.length(); i++) {
}
измените это в своем коде и дайте мне знать, если возникнут проблемы.
Исключение объясняет сам
org.json.JSONException: Value 200 at cod of type java.lang.String cannot be converted to JSONArray
Вы конвертируете String
в JSONArray
Вот,
contacts = jsonObj.getJSONArray(TAG_COd);
cod
является строкой, пока вы конвертируете ее в JSONArray
String cod = jsonObj.getJSONString(TAG_COd);