title: Not able to parse Json data from a weather api in Android
body: <p>I am trying to parse Json data from a weather api in Android.
   But i am getting errors. Here is the list of logcat errors:</p>
  
  <pre><code>10-17 21:22:36.395: E/log_tag(304): Error in http connection java.net.UnknownHostException: api.openweathermap.org
  10-17 21:22:36.395: E/log_tag(304): Error converting result java.lang.NullPointerException
  10-17 21:22:36.425: E/log_tag(304): Error parsing data org.json.JSONException: End of input at character 0 of 
  10-17 21:22:36.447: E/AndroidRuntime(304): FATAL EXCEPTION: AsyncTask #1
  10-17 21:22:36.447: E/AndroidRuntime(304): java.lang.RuntimeException: An error occured while executing doInBackground()
  10-17 21:22:36.447: E/AndroidRuntime(304):  at android.os.AsyncTask$3.done(AsyncTask.java:200)
  10-17 21:22:36.447: E/AndroidRuntime(304):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
  10-17 21:22:36.447: E/AndroidRuntime(304):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
  10-17 21:22:36.447: E/AndroidRuntime(304):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
  10-17 21:22:36.447: E/AndroidRuntime(304):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
  10-17 21:22:36.447: E/AndroidRuntime(304):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
  10-17 21:22:36.447: E/AndroidRuntime(304):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
  10-17 21:22:36.447: E/AndroidRuntime(304):  at java.lang.Thread.run(Thread.java:1096)
  10-17 21:22:36.447: E/AndroidRuntime(304): Caused by: java.lang.NullPointerException
  10-17 21:22:36.447: E/AndroidRuntime(304):  at com.example.work.MainActivity$DownloadJSON.doInBackground(MainActivity.java:63)
  10-17 21:22:36.447: E/AndroidRuntime(304):  at com.example.work.MainActivity$DownloadJSON.doInBackground(MainActivity.java:1)
  10-17 21:22:36.447: E/AndroidRuntime(304):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
  10-17 21:22:36.447: E/AndroidRuntime(304):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
  10-17 21:22:36.447: E/AndroidRuntime(304):  ... 4 more
  </code></pre>
  
  <p>Here is my code:
  MainActivity.java:</p>
  
  <pre><code>package com.example.work;
  
  import java.util.ArrayList;
  import java.util.HashMap;
  
  import org.json.JSONArray;
  import org.json.JSONException;
  import org.json.JSONObject;
  
  import android.app.Activity;
  import android.app.ProgressDialog;
  import android.os.AsyncTask;
  import android.os.Bundle;
  import android.util.Log;
  import android.widget.ListView;
  
  public class MainActivity extends Activity {
      // Declare Variables
      JSONObject jsonobject;
      JSONArray jsonarray;
      ListView listview;
      ListViewAdapter adapter;
      ProgressDialog mProgressDialog;
      ArrayList&lt;HashMap&lt;String, String&gt;&gt; arraylist;
      static String NAME = "rank";
      static String TYPE = "country";
      static String FLAG = "flag";
  
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          // Get the view from listview_main.xml
          setContentView(R.layout.activity_main);
          // Execute DownloadJSON AsyncTask
          new DownloadJSON().execute();
      }
  
      // DownloadJSON AsyncTask
      private class DownloadJSON extends AsyncTask&lt;Void, Void, Void&gt; {
  
          //@Override
          //protected void onPreExecute() {
            //  super.onPreExecute();
              // Create a progressdialog
              //mProgressDialog = new ProgressDialog(MainActivity.this);
  
              // Set progressdialog message
              //mProgressDialog.setMessage("Loading...");
              //mProgressDialog.setIndeterminate(false);
              // Show progressdialog
              //mProgressDialog.show();
         // }
          @Override
          protected Void doInBackground(Void... params) {
              // Create an array
              arraylist = new ArrayList&lt;HashMap&lt;String, String&gt;&gt;();
              // Retrieve JSON Objects from the given URL address
              jsonobject = JSONParser
                      .getJSONfromURL("http://api.openweathermap.org/data/2.5/weather?id=2172797");
  
              try {
                  // Locate the array name in JSON
                  jsonarray = jsonobject.getJSONArray("id");
  
                  for (int i = 0; i &lt; jsonarray.length(); i++) {
                      HashMap&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();
                      jsonobject = jsonarray.getJSONObject(i);
                      // Retrive JSON Objects
                     map.put(MainActivity.NAME, jsonobject.getString("main"));
  map.put(MainActivity.TYPE, jsonobject.getString("description"));
  //map.put(MainActivity.FLAG, jsonobject.getString("restaurantIMAGE"));
                      // Set the JSON Objects into the array
                      arraylist.add(map);
                  }
              } catch (JSONException e) {
                  Log.e("Error", e.getMessage());
                  e.printStackTrace();
              }
              return null;
          }
  
          @Override
          protected void onPostExecute(Void args) {
              // Locate the listview in listview_main.xml
              listview = (ListView) findViewById(R.id.listview);
              // Pass the results into ListViewAdapter.java
              adapter = new ListViewAdapter(MainActivity.this, arraylist);
              // Set the adapter to the ListView
              listview.setAdapter(adapter);
              // Close the progressdialog
              mProgressDialog.dismiss();
          }
      }
  }
  </code></pre>
  
  <p>JSONParser.java:</p>
  
  <pre><code>public class JSONParser {
  public static JSONObject getJSONfromURL(String url) {
      InputStream is = null;
      String result = "";
      JSONObject jArray = null;
  
      // Download JSON data from URL
      try {
          HttpClient httpclient = new DefaultHttpClient();
          HttpGet httpget = new HttpGet(url);
          HttpResponse response = httpclient.execute(httpget);
          HttpEntity entity = response.getEntity();
          is = entity.getContent();
  
      } catch (Exception e) {
          Log.e("log_tag", "Error in http connection " + e.toString());
      }
  
      // Convert response to string
      try {
          BufferedReader reader = new BufferedReader(new InputStreamReader(
                  is, "iso-8859-1"), 8);
          StringBuilder sb = new StringBuilder();
          String line = null;
          while ((line = reader.readLine()) != null) {
              sb.append(line + "\n");
          }
          is.close();
          result = sb.toString();
      } catch (Exception e) {
          Log.e("log_tag", "Error converting result " + e.toString());
      }
  
      try {
  
          jArray = new JSONObject(result);
      } catch (JSONException e) {
          Log.e("log_tag", "Error parsing data " + e.toString());
      }
  
      return jArray;
  }
  }
  </code></pre>
  
  <p>ListViewAdapter.java:</p>
  
  <pre><code>public class ListViewAdapter extends BaseAdapter {
  
      // Declare Variables
      Context context;
      LayoutInflater inflater;
      ArrayList&lt;HashMap&lt;String, String&gt;&gt; data;
      //ImageLoader imageLoader;
      HashMap&lt;String, String&gt; resultp = new HashMap&lt;String, String&gt;();
  
      public ListViewAdapter(Context context,
              ArrayList&lt;HashMap&lt;String, String&gt;&gt; arraylist) {
          this.context = context;
          data = arraylist;
        //  imageLoader = new ImageLoader(context);
      }
  
      @Override
      public int getCount() {
          return data.size();
      }
  
      @Override
      public Object getItem(int position) {
          return null;
      }
  
      @Override
      public long getItemId(int position) {
          return 0;
      }
  
      public View getView(final int position, View convertView, ViewGroup parent) {
          // Declare Variables
          TextView main;
          TextView description;
          //ImageView flag;
  
          inflater = (LayoutInflater) context
                  .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  
          View itemView = inflater.inflate(R.layout.listview_item, parent, false);
          // Get the position
          resultp = data.get(position);
  
          // Locate the TextViews in listview_item.xml
          main = (TextView) itemView.findViewById(R.id.main);
          description = (TextView) itemView.findViewById(R.id.description);
  
          // Locate the ImageView in listview_item.xml
          //flag = (ImageView) itemView.findViewById(R.id.flag);
  
          // Capture position and set results to the TextViews
          main.setText(resultp.get(MainActivity.NAME));
          description.setText(resultp.get(MainActivity.TYPE));
          // Capture position and set results to the ImageView
          // Passes flag images URL into ImageLoader.class
        //  imageLoader.DisplayImage(resultp.get(MainActivity.FLAG), flag);
          // Capture ListView item click
          itemView.setOnClickListener(new OnClickListener() {
  
              @Override
              public void onClick(View arg0) {
                  // Get the position
                  resultp = data.get(position);
                  Intent intent = new Intent(context, SingleItemView.class);
                  // Pass all data rank
                  intent.putExtra("name", resultp.get(MainActivity.NAME));
                  // Pass all data country
                  intent.putExtra("type", resultp.get(MainActivity.TYPE));
                  // Pass all data flag
                 // intent.putExtra("flag", resultp.get(MainActivity.FLAG));
                  // Start SingleItemView Class
                  context.startActivity(intent);
  
              }
          });
          return itemView;
      }
  }
  </code></pre>
  
  <p>SingleItemView.java: </p>
  
  <pre><code>public class SingleItemView {
      Intent intent = getIntent();
      String id = intent.getStringExtra("name");
      String name = intent.getStringExtra("type");
      private Intent getIntent() {
          // TODO Auto-generated method stub
          return null;
      }
  
  }
  </code></pre>
  
  <p>listview_item.xml in layout:</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="vertical" &gt;
  
  &lt;TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
  
          android:id="@+id/main"/&gt;
  
      &lt;TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
  
          android:id="@+id/description"/&gt;
  &lt;/LinearLayout&gt;
  </code></pre>
  
  <p>I am searching weather data by city id.But getting these errors. </p>