Android JSON Parsing using API

1.7k Views Asked by At

I'm having a hard time figuring out how to parse this JSON file correctly.

{
    "count": 10, 
    "timestamp": 1333243153, 
    "total": 100, 
    "diggs": [
        {
            "date": 1333243146, 
            "item": {
                "status": "upcoming", 
                "container": {
                    "name": "Politics", 
                    "short_name": "politics"
                }, 
                "description": "Major steps toward the disestablishment of Norway's state church, the (Lutheran) Church of Norway, were passed by the government on March 16 in its weekly session with King Harald V.", 
                "title": "National Secular Society - Norway continues the long process of disestablishing the Lutheran Church", 
                "submit_date": 1333206325, 
                "media": 0, 
                "diggs": 5, 
                "comments": 0, 
                "topic": {
                    "name": "Politics", 
                    "short_name": "politics"
                }, 
                "shorturl": {
                    "short_url": "http://digg.com/news/politics/national_secular_society_norway_continues_the_long_process_of_disestablishing_the_lutheran_church", 
                    "view_count": 0
                }, 
                "promote_date": null, 
                "link": "http://www.secularism.org.uk/news/2012/03/norway-continues-the-long-process-of-disestablishing-the-lutheran-church", 
                "href": "http://digg.com/news/politics/national_secular_society_norway_continues_the_long_process_of_disestablishing_the_lutheran_church", 
                "id": "20120331150525:56935e86-2dbf-4831-ad60-50def7781e68"
            }, 
            "user": {
                "name": "ghelms", 
                "links": [], 
                "registered": 1158007588, 
                "profileviews": 0, 
                "fullname": "Gary Helms", 
                "icon": "http://cdn2.diggstatic.com/user/614412/l.2001177284.png"
            }, 
            "digg_id": "20120401011907:5cf92ee9-e915-4358-b14f-cf140b760469"
        }, 
    ], 
    "offset": 0
 }

I'm trying to get only some of the elements "date", "description", "title", "diggs", "link", and "digg_id". Whenever I try parsing it will not work in listView nothing shows up, but if I use a String in my GetMethod class it will parse the entire API into a string and print it fine.

My code:

public DiggItemList lastDigg () throws Exception {
    ArrayList<HashMap<String,DiggItem>> diggsList = new  ArrayList<HashMap<String, DiggItem>>();
    JSONArray diggs = null;
    JSONObject json = null;
    Intent in = getIntent();
    String short_name = in.getStringExtra(TAG_SHORT_NAME);
    GetMethod get = new GetMethod();
    json = get.getInternetData();

    try {
        diggs = json.getJSONArray("diggs");

            dlists = new DiggItemList();
            for (int i = 0; i < diggs.length(); i++) {
                JSONObject c = diggs.getJSONObject(i);
                String date = c.getString("date");
                String description = c.getString("description");
                String title = c.getString("title");
                int digg = c.getInt("diggs");
                String link = c.getString("link");
                int digg_id = c.getInt("digg_id");

                //JSONObject topic = c.getJSONObject("topic");
                    //String sn = topic.getString("short_name");

                DiggItem di = new DiggItem();
                di.setDate(c.getInt("date"));
                di.setDescription(c.getString("description"));
                di.setTitle(c.getString("title"));
                di.setDiggs(c.getInt("diggs"));
                di.setLink(c.getString("link"));
                di.setDigg_id(c.getString("digg_id"));
                    dlists.add(di);
                    /*
                if (sn.equals(short_name)) {
                    dlists.add(di);
                }
                                */
            }

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

Class to get the API. (http://services.digg.com/2.0/digg.getAll).

public class GetMethod {

    public JSONObject getInternetData() throws Exception {
        BufferedReader in = null;
        String data = "";
        JSONObject jObj = null;
        try {
            HttpClient client = new DefaultHttpClient();
            URI website = new URI("http://services.digg.com/2.0/digg.getAll");
            HttpGet request = new HttpGet();
            request.setURI(website);
            HttpResponse response = client.execute(request);
            in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            StringBuffer sb = new StringBuffer("");
            String line = "";

            while ((line = in.readLine()) != null) {
                    sb.append(line + "\n");
            }
            in.close();
            data = sb.toString();
        }finally {
            if (in != null) {
                try {
                    in.close();
                }catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        try {
            jObj = new JSONObject(data);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;
    }
    }
3

There are 3 best solutions below

0
On

Just suggesting a simple way to do the desired... For more details refer and study the tutorial...https://stackoverflow.com/questions/5867544/android-json-parsing-tutorial/9742384#9742384

public void parseData throws Exception {

            try {
    HttpClient httpclient = new DefaultHttpClient();

                // Prepare a request object
        HttpGet httpget = new HttpGet("http://services.digg.com/2.0/digg.getAll");

                // Execute the request
                HttpResponse response;
                // Get hold of the response entity
                    HttpEntity entity = response.getEntity();
                    // If the response does not enclose an entity, there is no need
                    // to worry about connection release

                    if (entity != null) {

                        // A Simple JSON Response Read
                        // InputStream instream = entity.getContent();
                        // String result = convertStreamToString(instream).trim();

                        String result = EntityUtils.toString(entity);
    JsonObject json = new JsonObject(result);

    JSONArray diggsJsonArray = json.getJSONArray("diggs");

    for(int i =0;i<diggsJsonArray.length;i++)
    {
    JsonObject individualDiggsObj = diggsJsonArray.getJSONObject(i);

      DiggItem di = new DiggItem();
                    di.setDate(individualDiggsObj.getInt("date"));
     di.setDiggId(individualDiggsObj.getString("digg_id"));
    JSONOnejct itesmJson = new JSONOBJECT(individualDiggsObjgetJSONObject("item");

    //NOw Fetch and Set the values of status,title,description,, etc from the itemsJson to your collection.

    //Similarly begin with other inner Array's and Object's if available.   
                }catch(Exception e)
    {
    e.printStackTrace();
        }
0
On

In your code date a string type where as while storing in "DiggItem di" you are using c.getInt("date") that is a Integer value. Also the digg_id cannot be Integer because in response the value for digg_id is combination of alphanumeric so you can use String here also.

0
On

First Create an HTTP_HANDLER_CLASS...

public class HttpHandler {

private static final String TAG = HttpHandler.class.getSimpleName();

public HttpHandler() {
}

public String makeServiceCall(String reqUrl) {
    String response = null;
    try {
        URL url = new URL(reqUrl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        // read the response
        InputStream in = new BufferedInputStream(conn.getInputStream());
        response = convertStreamToString(in);
    } catch (MalformedURLException e) {
        Log.e(TAG, "MalformedURLException: " + e.getMessage());
    } catch (ProtocolException e) {
        Log.e(TAG, "ProtocolException: " + e.getMessage());
    } catch (IOException e) {
        Log.e(TAG, "IOException: " + e.getMessage());
    } catch (Exception e) {
        Log.e(TAG, "Exception: " + e.getMessage());
    }
    return response;
}

private String convertStreamToString(InputStream is) {
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();

    String line;
    try {
        while ((line = reader.readLine()) != null) {
            sb.append(line).append('\n');
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return sb.toString();
}
}

Then Create A private class to fetch Data

private class GetContacts extends AsyncTask<Void, Void, Void> {

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

    }

    @Override
    protected Void doInBackground(Void... arg0) {
        HttpHandler sh = new HttpHandler();

        // Making a request to url and getting response
        String jsonStr = sh.makeServiceCall(url);

        Log.e(TAG, "Response from url: " + jsonStr);

        if (jsonStr != null) {
            try {
                JSONObject jsonObj = new JSONObject(jsonStr);

                // Getting JSON Array node
                JSONArray contacts = jsonObj.getJSONArray("data");

                // looping through All Contacts
                for (int i = 0; i < contacts.length(); i++) {
                    JSONObject JO = (JSONObject) contacts.get(i);
                    /*if(JO.has("devices"))
                    {
                        Toast.makeText(Index.this,"No Data Found",Toast.LENGTH_LONG).show();
                    }*/
                    JSONObject jb = (JSONObject) JO.get("devices");

                    String id = jb.getString("user_id");
                    String trip_id = jb.getString("id");
                    String product = jb.getString("product");
                    String name = jb.getString("devices");
                    String start_geo = jb.getString("address");
                    String end_lat = jb.getString("Latitude");
                    String end_long = jb.getString("longitude");
                    //String gender = jb.getString("pointtopoint_estimate_id");


                    HashMap<String, String> contact = new HashMap<>();

                    // adding each child node to HashMap key => value
                    contact.put("id", id);
                    contact.put("trip_id", trip_id);
                    contact.put("product", product);
                    contact.put("name", name);
                    contact.put("start_geo", start_geo);
                    contact.put("end_lat",end_lat );
                    contact.put("end_long",end_long );

                    // adding contact to contact list
                    contactList.add(contact);
                }
            } catch (final JSONException e) {
                Log.e(TAG, "Json parsing error: " + e.getMessage());
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(),
                                "Your Internet Connection is Weak. Try Reloading Your Page",
                                Toast.LENGTH_LONG)
                                .show();
                    }
                });

            }
        } else {
            Log.e(TAG, "Couldn't get json from server.");
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getApplicationContext(),
                            "Check Your Internet Connection",
                            Toast.LENGTH_LONG)
                            .show();
                }
            });

        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        // Dismiss the progress dialog
        if (pDialog.isShowing())
            pDialog.dismiss();
}
}