2016-05-21 2 views
0

im получение этой ошибки, пытаясь построить парсер JSON с ListView. Я попробовал этот код с другим источником JSON и он работает, но с этой ссылкой аварией: http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.geojsonJSON parser java.lang.NullPointerException

люблю я бы некоторую помощь: D

Ошибка:

05-21 20:53:32.871 2509-2606/com.ikeres.app.professorearthquake  W/System.err: org.json.JSONException: End of input at character 0 of 
05-21 20:53:32.872 2509-2606/com.ikeres.app.professorearthquake W/System.err:  at org.json.JSONTokener.syntaxError(JSONTokener.java:449) 
05-21 20:53:32.872 2509-2606/com.ikeres.app.professorearthquake W/System.err:  at org.json.JSONTokener.nextValue(JSONTokener.java:97) 
05-21 20:53:32.872 2509-2606/com.ikeres.app.professorearthquake W/System.err:  at org.json.JSONObject.<init>(JSONObject.java:156) 
05-21 20:53:32.872 2509-2606/com.ikeres.app.professorearthquake W/System.err:  at org.json.JSONObject.<init>(JSONObject.java:173) 
05-21 20:53:32.872 2509-2606/com.ikeres.app.professorearthquake W/System.err:  at com.ikeres.app.professorearthquake.MainActivity.ParseJSON(MainActivity.java:102) 
05-21 20:53:32.872 2509-2606/com.ikeres.app.professorearthquake W/System.err:  at com.ikeres.app.professorearthquake.MainActivity.access$200(MainActivity.java:19) 
05-21 20:53:32.872 2509-2606/com.ikeres.app.professorearthquake W/System.err:  at com.ikeres.app.professorearthquake.MainActivity$GetTerremotos.doInBackground(Mai nActivity.java:70) 
05-21 20:53:32.872 2509-2606/com.ikeres.app.professorearthquake W/System.err:  at com.ikeres.app.professorearthquake.MainActivity$GetTerremotos.doInBackground(Mai nActivity.java:44) 
05-21 20:53:32.872 2509-2606/com.ikeres.app.professorearthquake W/System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:295) 
05-21 20:53:32.872 2509-2606/com.ikeres.app.professorearthquake W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
05-21 20:53:32.872 2509-2606/com.ikeres.app.professorearthquake W/System.err:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
05-21 20:53:32.872 2509-2606/com.ikeres.app.professorearthquake W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
05-21 20:53:32.872 2509-2606/com.ikeres.app.professorearthquake W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
05-21 20:53:32.872 2509-2606/com.ikeres.app.professorearthquake W/System.err:   at java.lang.Thread.run(Thread.java:818) 

Вот MainActivity:

public class MainActivity extends ListActivity { 

// URL to get contacts JSON 
private static String url = "http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.geojson"; 

// JSON Node names 
private static final String TAG_FEATURES = "features"; 
private static final String TAG_PROPERTIES = "properties"; 
private static final String TAG_LUGAR = "lugar"; 
private static final String TAG_MAGNITUD = "magnitud"; 
private static final String TAG_HORA = "hora"; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // Calling async task to get json 
    new GetTerremotos().execute(); 
} 

/** 
* Async task class to get json by making HTTP call 
*/ 
private class GetTerremotos extends AsyncTask<Void, Void, Void> { 

    // Hashmap for ListView 
    ArrayList<HashMap<String, String>> terremotostList; 
    ProgressDialog pDialog; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     // Showing progress dialog 
     pDialog = new ProgressDialog(MainActivity.this); 
     pDialog.setMessage("Please wait..."); 
     pDialog.setCancelable(false); 
     pDialog.show(); 
    } 

    @Override 
    protected Void doInBackground(Void... arg0) { 
     // Creating service handler class instance 
     WebRequest webreq = new WebRequest(); 

     // Making a request to url and getting response 
     String jsonStr = webreq.makeWebServiceCall(url, WebRequest.GET); 

     Log.d("Response: ", "> " + jsonStr); 

     terremotostList = ParseJSON(jsonStr); 

     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(
       MainActivity.this, terremotostList, 
       R.layout.list_item, new String[]{TAG_LUGAR, TAG_MAGNITUD, 
       TAG_HORA}, new int[]{R.id.name, 
       R.id.email, R.id.mobile}); 

     setListAdapter(adapter); 
    } 

} 

private ArrayList<HashMap<String, String>> ParseJSON(String json) { 
    if (json != null) { 
     try { 
      // Hashmap for ListView 
      ArrayList<HashMap<String, String>> studentList = new ArrayList<HashMap<String, String>>(); 

      JSONObject jsonObj = new JSONObject(json); 

      // Getting JSON Array node 
      JSONArray terremotos = jsonObj.getJSONArray(TAG_FEATURES); 

      // looping through All HeartQuakes 
      for (int i = 0; i < terremotos.length(); i++) { 
       JSONObject c = terremotos.getJSONObject(i); 




       // Properties node is JSON Object 
       JSONObject properties = c.getJSONObject(TAG_PROPERTIES); 
       String lugar = properties.getString(TAG_LUGAR); 
       String magnitud = properties.getString(TAG_MAGNITUD); 
       String hora = properties.getString(TAG_HORA); 

       // tmp hashmap for single hq 
       HashMap<String, String> oterremoto = new HashMap<String, String>(); 

       // adding each child node to HashMap key => value 
       oterremoto.put(TAG_LUGAR, lugar); 
       oterremoto.put(TAG_MAGNITUD, magnitud); 
       oterremoto.put(TAG_HORA, hora); 


       // adding student to hq list 
       studentList.add(oterremoto); 
      } 
      return studentList; 
     } catch (JSONException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } else { 
     Log.e("ServiceHandler", "Couldn't get any data from the url"); 
     return null; 
    } 
} 

}

WebRequest класс:

public class WebRequest { 

static String response = null; 
public final static int GET = 1; 
public final static int POST = 2; 

//Constructor with no parameter 
public WebRequest() { 

} 

/** 
* Making web service call 
* 
* @url - url to make request 
* @requestmethod - http request method 
*/ 
public String makeWebServiceCall(String url, int requestmethod) { 
    return this.makeWebServiceCall(url, requestmethod, null); 
} 

/** 
* Making service call 
* 
* @url - url to make request 
* @requestmethod - http request method 
* @params - http request params 
*/ 
public String makeWebServiceCall(String urladdress, int requestmethod, 
           HashMap<String, String> params) { 
    URL url; 
    String response = ""; 
    try { 
     url = new URL(urladdress); 

     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setReadTimeout(15000); 
     conn.setConnectTimeout(15000); 
     conn.setDoInput(true); 
     conn.setDoOutput(true); 

     if (requestmethod == POST) { 
      conn.setRequestMethod("POST"); 
     } else if (requestmethod == GET) { 
      conn.setRequestMethod("GET"); 
     } 

     if (params != null) { 
      OutputStream os = conn.getOutputStream(); 
      BufferedWriter writer = new BufferedWriter(
        new OutputStreamWriter(os, "UTF-8")); 

      StringBuilder result = new StringBuilder(); 
      boolean first = true; 
      for (Map.Entry<String, String> entry : params.entrySet()) { 
       if (first) 
        first = false; 
       else 
        result.append("&"); 

       result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); 
       result.append("="); 
       result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); 
      } 

      writer.write(result.toString()); 

      writer.flush(); 
      writer.close(); 
      os.close(); 
     } 

     int responseCode = conn.getResponseCode(); 

     if (responseCode == HttpsURLConnection.HTTP_OK) { 
      String line; 
      BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
      while ((line = br.readLine()) != null) { 
       response += line; 
      } 
     } else { 
      response = ""; 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return response; 
} 

}

+0

'ParseJSON (jsonStr)' in 'terremotostList = ParseJSON (jsonStr)' может возвращать значение null. Можете ли вы записать строку JSON в начале 'ParseJSON (jsonStr)', чтобы убедиться, что 'JSON' был загружен правильно? –

+0

Я думаю, проблема в том, что вы сказали, но я новичок, и я не знаю, как проверить, была ли загружена строка JSON. –

+0

Хорошо @R. Кирилл отлично справился с этой проблемой, но вы могли бы извлечь выгоду из изучения того, как отлаживать ответы сервера, поэтому сделайте так: Before 'if (json! = Null)' try' Log.v («JSON Response», json) ', затем проверьте logcat, чтобы узнать, получаете ли вы ответ, предоставленную вами ссылку. –

ответ

0

Наконец получил его. Удалите следующие строки из WebRequest класса:

conn.setDoInput(true); 
    conn.setDoOutput(true); 

добавить следующее после conn.setRequestMethod("GET");:

conn.connect(); 

Теперь вы получите JSON из API. После этого ваше приложение ничего не отобразит. Это потому, что ваши теги все на испанском языке и API на английском языке, так что изменить:

private static final String TAG_LUGAR = "lugar"; 
private static final String TAG_MAGNITUD = "magnitud"; 
private static final String TAG_HORA = "hora"; 

к:

private static final String TAG_LUGAR = "place"; 
private static final String TAG_MAGNITUD = "mag"; 
private static final String TAG_HORA = "time"; 

Он работает после этих изменений.

+0

Вы правы, я очень люблю вас, очень спасибо за ур Помогите!! –

+0

Ничего страшного, рад, что я мог бы помочь, извините, потребовалось время. Просто отметьте это как ответ. –

0

Вы должны проверить поля существования при анализе вашего JSON. Ваш код не в этой строке:

String lugar = properties.getString(TAG_LUGAR); 

, потому что нет такого поля lugar в возвращенном JSON. Так эта линия бросает исключение, которое поймают с этим кодом:

catch (JSONException e) { 
     e.printStackTrace(); 
     return null; 
    } 

NULL и возвращает. Затем вы создаете адаптер и передавая пустой объект:

ListAdapter adapter = new SimpleAdapter(
      MainActivity.this, terremotostList, 
      R.layout.list_item, new String[]{TAG_LUGAR, TAG_MAGNITUD, 
      TAG_HORA}, new int[]{R.id.name, 
      R.id.email, R.id.mobile}); 

(terremotostList равно нулю)

и, наконец, ваш адаптер не пытается получить доступ к getCount метод вашего списка, который является нулевым.

Как решить эту проблему? Вы должны либо проверить наличие поля перед тем, как его значение:

String lugar = properties.has(TAG_LUGAR) ? properties.getString(TAG_LUGAR) : null; 

или просто использовать optString метод, который не выбрасывает исключение, если поле не существует:

String lugar = properties.optString(TAG_LUGAR); 
+0

Thx, я попробовал это, но он по-прежнему разбился, я попытался разобрать другой url, и он работает, im настолько запутанный прямо сейчас –

+0

Вы пытались заменить optString другими строковыми полями (magnitud и hora)? – x0r

+0

Также Daniel упомянул выше, что вы должны убедиться, что вы получаете json с сервера, и он не пуст – x0r